我在一个活动中有多个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);
}
};
}
答案 0 :(得分:2)
从文档“当你创建一个新的Handler时,它被绑定到创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并执行它们当他们走出消息队列时。“
所以你是对的,它们将按你在UI线程上排队的顺序运行(因为你要在onCreate中创建它们)。
答案 1 :(得分:2)
每次一条消息,每个线程和每个处理程序。
每个Looper实例都有其主方法loop()
loop(){
while(true){
Message msg = messageQueue.next();
msg.target.dispatchMessage(msg);
}
}
每条消息都设置了一个(处理程序)目标,如果没有,则抛出异常(在MessageQueue.enqueueMessage()内)。
所以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()