ハンドラが異なるスレッドから同じLooperでリッスンするよう実装しようとしています。Looper.getMainLooper()で初期化されたハンドラがメッセージコールバックに応答しない
以下に、2つのハンドラがあります.1つはメインスレッドで作成され、もう1つは子スレッドで作成されますが、どちらもメインルーパーでリッスンするように初期化されます。
private Handler mMain;
public static final ThreadPoolExecutor tpe =
(ThreadPoolExecutor) Executors.newCachedThreadPool();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMain = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
Log.wtf("", "main:" + msg);
}
};
tpe.execute(new Runnable() {
private Handler tChild = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
Log.wtf("", "child:" + msg);
}
};
@Override
public void run() {
Log.wtf("", "send msg to main looper");
tChild.sendEmptyMessage(100);
}
});
}
しかし、以下のようなメッセージを送信すると、子ハンドラだけがメッセージを出力します。メインハンドラはメッセージを受信しません。
03-20 22:02:26.754: A/(12857): send msg to main looper
03-20 22:02:26.847: A/(12857): child:{ what=100 when=-8ms }
私は間違っていますか?読んでくれてありがとう。
私は、ありがとう!ある日、Runnableが内部クラスではなく外部クラスだったとすると、私は初期化されたHandlerをそのコンストラクタ経由で渡すべきでしょうか? –
アーキテクチャはアプリケーションに依存しますが、メッセージを投稿する予定がある場合は、どこからでも 'Handler'への参照が必要になります。 – Devunwired
アプリケーションコンテキスト(アプリケーションを拡張するクラス)でHandler(this.getMainLooper())を1つだけ使用するのはなぜですか?これをアクティビティで行うよりもきれいではないでしょうか? –