0

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

4

2 に答える 2

1

HandlerThreadの目的は、独自のルーパーを持つスレッドを作成することです。

ルーパーを使用してスレッドに複数のハンドラーオブジェクトを作成できますか?

はい、複数のハンドラーが同じLooperとMessageQueueを使用できます。

タッチなどの他のUI関連のイベントがそれぞれのハンドラーによって処理されるように?

ここで質問しようとしていることに混乱していますが、メインスレッドのみがUIオブジェクトにアクセスできることを知っています。

于 2013-03-12T21:19:35.513 に答える
0

サムの答えはそれを理解していないと思います。

問題は次のとおりです。次のコードのように、コンストラクターパラメーターと同じスレッドまたは同じルーパーで作成されたハンドラーが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()

通常、メッセージの送信に使用するのと同じハンドラーでメッセージを受信します

于 2017-03-14T07:57:03.157 に答える