Android处理程序线程

时间:2013-03-12 21:13:13

标签: android

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

2 个答案:

答案 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()

通常,我们会在用于发送消息的同一个处理程序中接收消息