Handler允许您发送和处理与线程的MessageQueue关联的Message和Runnable对象。每个Handler实例都与一个线程和该线程的消息队列相关联。当您创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并在消息出来时执行它们队列中。
http://developer.android.com/reference/android/os/Handler.html
这是否意味着Runnable对象会阻止之后发布的消息? 消息和Runnable对象实际上在一个队列中?
手册对我来说有点模棱两可。
谢谢!
答案 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线程。