我可以为带有looper的线程创建多个处理程序对象吗?假设我创建了两个与UIThread的Handler
相关联的新h1
对象h2
和Looper
。 h1
正在发布Message
m1
而h2
正在向{UIDhread m2
发布Looper
。h1.handleMessage()
和h2.handleMessage()
分别处理m1和m2,以便其他UI相关事件(如触摸)由各自的处理程序处理??
答案 0 :(得分:1)
HandlerThread的目的是使用拥有 Looper创建一个Thread。
我可以为具有looper的线程创建多个处理程序对象吗?
是的,多个处理程序可以使用相同的Looper和MessageQueue。
以便其他与UI相关的事件(如触摸)由各自的处理程序处理?
虽然我对你在这里要求的内容感到困惑,但我知道只有主线程可以访问UI对象。
答案 1 :(得分:0)
我认为萨姆的回答并没有得到它。
问题是:如果我有2个或更多的处理程序在同一个线程中创建,或者使用与构造函数参数相同的looper,如下面的代码:
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
调度消息:< / p>
msg.target.dispatchMessage(msg);//decides which handler to process. This code is in Looper.loop()
通常,我们会在用于发送消息的同一个处理程序中接收消息