当前位置 博文首页 > 庆述倾述:Activity.runOnUiThread的理解

    庆述倾述:Activity.runOnUiThread的理解

    作者:[db:作者] 时间:2021-08-05 12:44

    我们知道在子线程中更新UI的时候,其中一种方式就有runOnUiThread(Runnable)。这里记录下这个方法的工作流程。

    • 首先判断当前是不是 UI线程,如果是就直接执行传入的Runnable接口的run方法;
    • 否则就通过Activity类中的Handler实例的post(Runnable)方法来发送消息,最终调用handlerenqueueMessage方法将消息加入到消息队列中,因为在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