ルーパーを使用してスレッドに複数のハンドラーオブジェクトを作成できますか?2つの新しいHandler
オブジェクトh1
を作成h2
し、UIThreadに関連付けたとしLooper
ます。h1
は投稿Message
m1
していて、UIThreadにh2
投稿しています。タッチなどの他のUI関連のイベントがそれぞれのハンドラーによって処理されるように、それぞれm1とm2を処理しますか?m2
Looper
h1.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()
通常、メッセージの送信に使用するのと同じハンドラーでメッセージを受信します