2017-03-29 20 views
0

シリアルポートの入力ストリームをリスンするスレッドを作成します。 入力データが来たら、UIスレッドにメッセージを送りたい。UIスレッドにメッセージを送信

タスクを実行する前に、スレッドからメッセージを送信して、間隔が5000ミリ秒になり、UIスレッドにメッセージを送信しようとしました。Toast ログからは、スレッドが作成され、正常に実行されていることがわかりましたが、番号はUIスレッドのtoastedではありません。

スレッドからUIスレッドにメッセージを送信できないか、UIスレッドのMessageQueueでメッセージを処理できないことが原因だと思います。

私のコードで何が問題になっていますか? 多くの感謝!

MainActivity.java:

public class MainActivity extends Activity { 
    ... 
    @Override 
    protected void onCreate(Bundle savedInstancesState) { 
     ... 
     setMessageProcessor(); 
     SerialPortListener.start(); 
    }   

    private void setMessageProcessor() { 
     new Handler(Looper.getMainLooper()) { 
      public void handleMessage(Message msg) { 
       Toast.makeText(MainActivity.this, 
        "Message: " + msg.obj.toString(), 
        Toast.LENGTH_SHORT).show(); 
      } 
     }; 
    } 
} 

SerialPortListener.java:

public class SerialPortListener { 
    ... 
    private static int testNumber = 1; 
    public static void start() { 
     ... 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while (true) { 
        Message msg = new Message(); 
        msg.obj = testNumber++; 
        new Handler(Looper.getMainLooper()).sendMessage(msg); 
        Log.i("TEST", "TEST); 
        try { 
         Thread.sleep(5000); 
        } catche(Exception e) { 
         ... 
        } 
       } 
      } 
     }); 
     thread.start(); 
    } 
} 
+0

関連:http://stackoverflow.com/questions/4369537/update-ui-from-thread – k3b

答えて

2

あなたが "リーダー・スレッド" の中からメインスレッドにバインドされた第二Handlerを作成しているためです。メインスレッドのハンドラに匿名オブジェクトを使用しないでください。メンバーフィールドにしてください。次に、あなたの読者のスレッドで、その特定のHandlerMessageを送る:

private void setMessageProcessor() { 
    mHandler = new Handler() { 
     ... 
    } 
} 

public class SerialPortListener { 
... 
private static int testNumber = 1; 
public static void start() { 
    ... 
    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      while (true) { 
       Message msg = mHandler.obtainMessage(); 
       msg.obj = testNumber++; 
       msg.sendToTarget(); 
       Log.i("TEST", "TEST); 
       ... 
     } 
    } 
} 
+0

私は宣言する必要があるので、それは意味 '私のメインスレッドに '' public static Handler'''がありますか? '' 'Handler'''で宣言できますか? – Nestarneal

+0

'SerialPortListener'が' Activity'の内部クラスである限り、問題ありません。より良いアプローチ(私はあなたが別々のファイルにそれらを持っていたので) 'Handler'をあなたの' SerialPortListener'に渡すことでしょう。 –

関連する問題