Android 2.1:单个活动中的多个处理程序

时间:2010-05-13 19:15:04

标签: android multithreading handler message-queue

我在一个活动中有多个Handlers。我在主要活动的onCreate()中创建了所有处理程序。我的理解是每个处理程序的handleMessage()方法永远不会同时被调用,因为所有消息都放在同一个队列中(Activity线程MessageQueue)。因此,它们将按照放入队列的顺序执行。它们也将在主活动线程中执行。它是否正确 ?

 public void onCreate() {

this.handler1 = new Handler() {
@Override
public void handleMessage(Message msg) {

                            //operation 1 : some operation with instanceVariable1
super.handleMessage(msg);
}
};

this.handler2 = new Handler() {

@Override
public void handleMessage(Message msg) {
                            //Operation 2: some operation with instanceVariable1
super.handleMessage(msg);
}

};

this.handler3 = new Handler() {
@Override
public void handleMessage(Message msg) {
                            //Operation 3: some operation with instanceVariable1
super.handleMessage(msg);

}
};
}

2 个答案:

答案 0 :(得分:2)

从文档“当你创建一个新的Handler时,它被绑定到创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并执行它们当他们走出消息队列时。“

所以你是对的,它们将按你在UI线程上排队的顺序运行(因为你要在onCreate中创建它们)。

答案 1 :(得分:2)

每次一条消息,每个线程和每个处理程序。

  1. 每个新的Handler(...)实例都显式或隐式地绑定到Looper实例,并且只绑定一次。
  2. 已经使用Looper.prepare()调用在某处创建了Looper实例 //通常由Activity.getMainLooper()或Looper.myLooper()
  3. 获得
  4. Looper.prepare()使用ThreadLocal变量sThreadLocal(静态字段)为每个线程创建一个Looper实例。 (它的工作原理与hashMap.put(Thread.getCurrent(),new Looper())相同))
  5. 每个looper都有自己的私有MessageQueue
  6. 每个Looper实例都有其主方法loop()

    loop(){
        while(true){
            Message msg = messageQueue.next();
            msg.target.dispatchMessage(msg);
        }
    }
    
  7. 每条消息都设置了一个(处理程序)目标,如果没有,则抛出异常(在MessageQueue.enqueueMessage()内)。

  8. 因为Handler不能绑定到几个Loopers,所以每个处理程序只接收一条消息,并且只有msg.target == handler
  9. 所以sendMessage()或postMessage()的工作原理如下:

        handler.post(Message msg){
            Looper.sThreadLocal.get(Thread.getCurrent()).messageQueue.push(msg);
        }
    

    所以调用堆栈,而处理消息,应该看起来像这样:

    Looper.myLooper()-> Thread.getCurrent()-> Looper-> MessageQueue.next()-> Message-> Message.target-> Handler-> dispatchMessage()-> handleMessage()