0

我可以为带有 looper 的线程创建多个处理程序对象吗?假设我创建了两个新Handler对象h1h2与 UIThread 的Looper. h1正在发布Message m1h2正在发布m2到 UIThread 的Looper.doesh1.handleMessage()h2.handleMessage()分别处理 m1 和 m2,以便其他 UI 相关事件(例如触摸)由它们各自的处理程序处理?

4

2 回答 2

1

HandlerThread的目的是创建一个带有自己Looper 的 Thread。

我可以为带有 looper 的线程创建多个处理程序对象吗?

是的,多个处理程序可以使用相同的 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),哪个处理程序将处理消息?

我的答案是 Handler h2,每条消息只会由target 消息属性选择的处理程序处理一次,默认是谁发送谁处理。在您的问题中,h1.handleMessage()h2.handleMessage()分别处理 m1 和 m2 ,以便其他与 UI 相关的事件(例如触摸)由它们各自的处理程序处理。

我们可以深入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 回答