1

以下は、AndroidでマルチキャストWifiデータを受信するための私のコードです。以下のようなランナブルを使用して GUI を更新していますが、一部のパケットが欠落していることがわかりました。このコードを使用してカウント ダウン メッセージを受信して​​いますが、カウント ダウンは連続していません。GUI 更新のスタイルが原因でパケットが失われたのか、それとも他の問題が原因でパケットが失われたのかはわかりません。皆さんに提案をお願いします。

    package com.example.cdttiming;

    public class MainActivity extends Activity
    {
        EditText time;
        String s;
        Button button;
     InetAddress ia = null;

         byte[] bmessage = new byte[1500];
         DatagramPacket dp = new DatagramPacket(bmessage, bmessage.length);
         MulticastSocket ms = null;
        @Override

        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);     

            time = (EditText) findViewById(R.id.et_time);
        try 
            {
            WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
            //wm.setWifiEnabled(true);      
            WifiManager.MulticastLock multicastLock = wm.createMulticastLock("multicastLock");
            multicastLock.setReferenceCounted(true);        
            multicastLock.acquire();      

            ia = InetAddress.getByName("226.1.1.1");    
            try {
                ms = new MulticastSocket(4321);
                } catch (IOException e) {
                e.printStackTrace();
                }
            try {
                ms.joinGroup(ia);
                } catch (IOException e) {
                e.printStackTrace();
                }

            ms.setReuseAddress(true);


            }
               catch (UnknownHostException e)
                {
                e.printStackTrace();

                }
                catch (IOException e) 
                 {
                    e.printStackTrace();
                 }     
         }

        public void startProgress(View view) {
        Runnable runnable = new Runnable() {
              @Override
              public void run() {

            while(true)
                {
                 try
                 {
                      ms.receive(dp);
              s = new String(dp.getData(),0,dp.getLength()); 
                                         }
                 catch (UnknownHostException e)
                    {
                    e.printStackTrace();

                    }
                   catch (IOException e) 
                    {
                      e.printStackTrace();
                    }     


                   time.post(new Runnable() {
                    @Override
                    public void run() {
                        time.setText(s);

                    }
                  });
               }  // while
              }
            };
            new Thread(runnable).start();
          }

        @Override
         public boolean onCreateOptionsMenu(Menu menu)
        {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }   
    }
4

1 に答える 1

1

メイン UI スレッドにアクセスできません。そのため、テキストを UI ビュー要素に設定することはできません。

UI スレッドにアクセスする方法はいくつかあります 1) Activity.runOnUiThread() を使用します

this.runOnUiThread( new Runnable() { @Override
                    public void run() {
                        time.setText(s);

                    } })

2)あなたの場合、ワーカースレッドとメインUIスレッドの間のブリッジであるHandlerオブジェクトを使用するのが最善だと思います

         private Handler handler = new Handler(){
                 @Override
                 public void handleMessage(Message message) {
                     switch (message.what) {
                         case SET_TEXT:{
                             time.setText(s);
                         }break;
     }
...
handler.sendEmptyMessage(SET_TEXT); 
于 2013-07-23T17:18:50.103 に答える