当前位置 博文首页 > 庆述倾述:Activity.runOnUiThread的理解
我们知道在子线程中更新UI
的时候,其中一种方式就有runOnUiThread(Runnable)
。这里记录下这个方法的工作流程。
UI
线程,如果是就直接执行传入的Runnable
接口的run
方法;Activity
类中的Handler
实例的post(Runnable)
方法来发送消息,最终调用handler
的enqueueMessage
方法将消息加入到消息队列中,因为在Activity
中的Handler
对象运行在主线程(主线程中的Handler
对象是在ActivityThread
类中的main
方法中创建的),故而这里就切换到了主线程中。也就是本质上其实还是消息机制。
这里贴下相关源码:
// Activity.java
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
// Handler.java
public final boolean post(@NonNull Runnable r) {
return sendMessageDelayed(getPostMessage(r), 0);
}
public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
}
cs