【问题标题】:Does handler.post(Runnable r) block the MessageQueue?handler.post(Runnable r) 会阻塞 MessageQueue 吗?
【发布时间】:2012-03-20 18:28:42
【问题描述】:

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

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

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

手册对我来说有点含糊。

谢谢!

【问题讨论】:

  • 我认为它将两种类型放在同一个 Que 中,并将逐步进行

标签: android


【解决方案1】:

检查这个的代码路径并不难。所以在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 线程。

【讨论】:

  • 我已经检查过了,但不是在 UI 线程中。实验表明,如果 Runable 对象休眠,最后的消息只是阻塞。我只是来安慰结论。无论如何,谢谢。
  • 是的,粗略的。如果 handler 已经开始处理休眠的 runnable,这个 handler 将被阻塞。这就是我想在回答中指出的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多