美文网首页
为什么主线程中调用了Looper.loop();方法没有卡死?

为什么主线程中调用了Looper.loop();方法没有卡死?

作者: 最美下雨天 | 来源:发表于2018-08-02 10:45 被阅读288次

严格来说呢,是卡死了,在ActivityThread类的main方法中调用了Looper.loop()方法之后,后面再没有其他代码,因为根本执行不到,loop()方法的内部就是个死循环,那么为什么Activity的生命周期方法、屏幕的各种点击触摸事件都能正常响应呢?因为在这个死循环中,是不断的从MessageQueue中获取消息的,有消息就处理,没有消息,就阻塞,Activity的各种生命周期函数也是通过发送Message来的到回调的
在ActivityThread中

public void handleMessage(Message msg) {
            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
            switch (msg.what) {
                case LAUNCH_ACTIVITY: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
                    final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

                    r.packageInfo = getPackageInfoNoCheck(
                            r.activityInfo.applicationInfo, r.compatInfo);
                    handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;
                case RELAUNCH_ACTIVITY: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");
                    ActivityClientRecord r = (ActivityClientRecord)msg.obj;
                    handleRelaunchActivity(r);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;
                case PAUSE_ACTIVITY: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
                    SomeArgs args = (SomeArgs) msg.obj;
                    handlePauseActivity((IBinder) args.arg1, false,
                            (args.argi1 & USER_LEAVING) != 0, args.argi2,
                            (args.argi1 & DONT_REPORT) != 0, args.argi3);
                    maybeSnapshot();
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;
    }
}

那么屏幕的触摸事件也是通过发送Message出来的吗?
参考知乎:https://www.zhihu.com/question/62218278
说到底,虽然不是通过Message,但是也是在loop()这个死循环中监听到的。

相关文章

网友评论

      本文标题:为什么主线程中调用了Looper.loop();方法没有卡死?

      本文链接:https://www.haomeiwen.com/subject/koljvftx.html