ルーパーを使用してスレッドに複数のハンドラーオブジェクトを作成できますか?2つの新しいHandlerオブジェクトh1を作成h2し、UIThreadに関連付けたとしLooperます。h1は投稿Message m1していて、UIThreadにh2投稿しています。タッチなどの他のUI関連のイベントがそれぞれのハンドラーによって処理されるように、それぞれm1とm2を処理しますか?m2Looperh1.handleMessage()h2.handleMessage()
2 に答える
HandlerThreadの目的は、独自のルーパーを持つスレッドを作成することです。
ルーパーを使用してスレッドに複数のハンドラーオブジェクトを作成できますか?
はい、複数のハンドラーが同じLooperとMessageQueueを使用できます。
タッチなどの他のUI関連のイベントがそれぞれのハンドラーによって処理されるように?
ここで質問しようとしていることに混乱していますが、メインスレッドのみがUIオブジェクトにアクセスできることを知っています。
サムの答えはそれを理解していないと思います。
問題は次のとおりです。次のコードのように、コンストラクターパラメーターと同じスレッドまたは同じルーパーで作成されたハンドラーが2つ以上ある場合:
Handler h1 = new Handler(Looper.mylooper())
{//override handleMessage, if receiving messageA then do actionA};
Handler h2 = new Handler(Looper.mylooper())
{//override handleMessage, if receiving messageA then do actionB}
次に、これを行います:h2.sendMsg(messageA)、どのハンドラーがメッセージを処理しますか?
私の答えはハンドラーh2です。各メッセージはtarget 、メッセージの属性によって選択されたハンドラーによって1回だけ処理されます。デフォルトでは、誰が誰を処理するかを送信します。あなたの質問では、h1.handleMessage()タッチh2.handleMessage()などの他のUI関連のイベントがそれぞれのハンドラーによって処理されるように、それぞれm1とm2を処理します。
Handlerのソースコードを深く掘り下げてみると、すべてのsendMessageメソッドが次のようにジャンプすることがわかります。
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this; // Note this!
...
return queue.enqueueMessage(msg, uptimeMillis);
}
このスレッドLooperがメッセージをキューから取り出すとき、Messageの属性に従ってメッセージをディスパッチしますtarget。
msg.target.dispatchMessage(msg);//decides which handler to process. This code is in Looper.loop()
通常、メッセージの送信に使用するのと同じハンドラーでメッセージを受信します