【Android】Handler 关于 new Handler 的问题

本文讲解为何主线程可以 new Handler ,如果想要在子线程中 new Handler 要做些什么准备。

第一个问题,

以 Launcher 界面点击图标跳转到 App 举例。触发AMS启动过程。

Launcher -> Zygote -> 给每一个应用创建一个虚拟机(ART),也可以说成为每一个进程创建一个虚拟机,也就是说每一个应用会有一个独立的虚拟机,也就是每一个应用会有一个独立的进程 -> ActivityThread(SDK -> android-29 -> android -> app -> ActivityThread)

 

ActivityThread.main()

public static void main(String[] args) {
    ...

    Looper.prepareMainLooper();

    ...

    Looper.loop();

    ...
}
public static void prepareMainLooper() {
    prepare(false);
    ...
}
private static void prepare(boolean quitAllowed) {
    ...
    sThreadLocal.set(new Looper(quitAllowed));
}

在 main 函数里,首先对 Looper 进行 prepare ,然后调用 Looper.loop() 。

所以正是因为这个原因(主线程的 Looper 初始化工作已经由系统帮我们完成),所以这个开关已经由主线程帮我们打开,正是因为这个原因我们在主线程里面使用的时候可以直接 new Handler。

 

第二个问题,

为线程准备一个 Looper 。所以在子线程中创建 Handler ,一定要对他进行 Looper.prepare() 和 Looper.loop() 。

 

如果本文对你有帮助,请点赞支持!!!

你可能感兴趣的:(Android,android)