我可以为带有 looper 的线程创建多个处理程序对象吗?假设我创建了两个新Handler
对象h1
并h2
与 UIThread 的Looper
. h1
正在发布Message
m1
并h2
正在发布m2
到 UIThread 的Looper
.doesh1.handleMessage()
并h2.handleMessage()
分别处理 m1 和 m2,以便其他 UI 相关事件(例如触摸)由它们各自的处理程序处理?
2 回答
HandlerThread的目的是创建一个带有自己Looper 的 Thread。
我可以为带有 looper 的线程创建多个处理程序对象吗?
是的,多个处理程序可以使用相同的 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)
,哪个处理程序将处理消息?
我的答案是 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()
通常,我们将在用于发送消息的同一处理程序中接收消息