2

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);

}
};
}
4

2 回答 2

2

来自文档“当您创建一个新的处理程序时,它会绑定到创建它的线程的线程/消息队列——从那时起,它将向该消息队列传递消息和可运行文件并在它们到来时执行它们离开消息队列。”

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

于 2010-05-13T19:41:52.090 回答
2

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

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

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

  7. 因为 Handler 不能绑定到多个 Loopers,所以每个处理程序一次只接收一条消息,并且只有 msg.target==handler

所以 sendMessage() 或 postMessage() 的工作方式如下:

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

所以调用 stack ,同时处理消息,应该是这样的:

Looper.myLooper()-> Thread.getCurrent()-> Looper-> MessageQueue.next()-> Message-> Message.target-> Handler-> dispatchMessage()-> handleMessage()
于 2015-06-18T13:38:10.897 回答