2010-05-13 40 views
2

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

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

@CommonsWare当你说“含多处e处理程序让我紧张“,你的意思是多个处理程序每​​单线程..请澄清 – Nike15 2016-03-09 07:35:42

回答

2

从文档“当你创建一个新的处理程序,它被绑定到创建它的线程的线程/消息队列 - 从这一点上来说,这将提供信息和可运行到该消息排队并在它们离开消息队列时执行它们。“

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

+0

谢谢!所以,我不必将“操作”同步到活动的实例变量。但是,如果_another_线程正在访问实例变量,我仍然必须“同步”。 – 2010-05-13 19:49:14

2

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

  1. 每个新的Handler(...)实例都明确或隐含地绑定到Looper实例,并且只绑定一次。
  2. 活套例如,已经与Looper.prepare某处创建()调用 //通常由Activity.getMainLooper()或Looper.myLooper()
  3. Looper.prepare()中得到使用ThreadLocal变量sThreadLocal(静磁场)每个线程有一个Looper实例。 (它的工作原理同样喜欢hashMap.put(Thread.getCurrent(),新活套()))
  4. 每尺蠖拥有自己的私人的MessageQueue
  5. 每尺蠖实例都有其主要的方法循环()

    loop(){ 
        while(true){ 
         Message msg = messageQueue.next(); 
         msg.target.dispatchMessage(msg); 
        } 
    } 
    
  6. 每条消息都有一个(Handler)目标被设置,如果没有,则引发异常(在MessageQueue.enqueueMessage()内)。

  7. 因为处理程序不能绑定到多个活套是这样做的每个处理器在时间仅接收一个消息,并只与msg.target ==处理器

这样的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() 
相关问题