2012-03-02 117 views
0

处理程序允许您发送和处理与线程的MessageQueue关联的消息和可运行对象。每个Handler实例都与单个线程和该线程的消息队列相关联。当您创建一个新的处理程序时,它将绑定到正在创建它的线程的线程/消息队列 - 此后,它将消息和可运行消息传递到该消息队列,并在消息出来时执行它们队列。handler.post(Runnable r)是否阻塞MessageQueue?

http://developer.android.com/reference/android/os/Handler.html

,这实际上意味着该Runnable对象将阻止后,发送的消息? 消息和Runnable对象实际上在一个队列中?

该手册对我来说有点模棱两可。

谢谢!

+0

我认为它把两种类型都放在同一个阙中,并且会逐渐进行 – waqaslam 2012-03-02 08:28:25

回答

0

检查代码路径并不难。因此,在Activity.java你有下面的代码通过Runnable到UI线程:

public final void runOnUiThread(Runnable action) { 
    if (Thread.currentThread() != mUiThread) { 
     mHandler.post(action); 
    } else { 
     action.run(); 
    } 
} 

那么对于Handler.post

public final boolean post(Runnable r) 
{ 
    return sendMessageDelayed(getPostMessage(r), 0); 
} 

基本上sendMessageDelayed只是单纯地将消息发送与延迟0毫秒。所以,最有趣的部分是如何getPostMessage从Runnable接口:

private final Message getPostMessage(Runnable r) { 
    Message m = Message.obtain(); 
    m.callback = r; 
    return m; 
} 

那么这是什么意思?这意味着如果Ui线程获取消息运行Runnable,则它的处理程序将尝试执行它。如果这个可运行的操作很长,它会阻塞可能导致ANR错误的Ui线程。

+0

我已经检查过这个,但是没有在UI线程中。该实验显示,如果Runable对象处于睡眠状态,则最后的消息刚刚被阻止。我只是来这里安慰结论。不管怎样,谢谢。 – Kane 2012-03-02 09:53:14

+0

是的,粗糙。如果处理程序已经开始处理睡眠的runnable,则该处理程序将被阻止。这是我想指出我的答案。 – Yury 2012-03-02 10:20:20