handler.post(Runnable r)是否阻止MessageQueue?

时间:2012-03-02 08:25:30

标签: android

  

Handler允许您发送和处理与线程的MessageQueue关联的Message和Runnable对象。每个Handler实例都与一个线程和该线程的消息队列相关联。当您创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并在消息出来时执行它们队列中。

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

这是否意味着Runnable对象会阻止之后发布的消息? 消息和Runnable对象实际上在一个队列中?

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

谢谢!

1 个答案:

答案 0 :(得分: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毫秒的消息。所以最有趣的部分是如何从Runnable中getPostMessage

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

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

相关问题