【Android】Handler 关于 new Handler 的问题
16lz
2021-01-24
本文讲解为何主线程可以 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如何停止Thread和AsyncTask
- Hyper-V 上的android
- android 下动画结束时闪烁问题
- Android多线程--Handler
- Handler+Message+MessageQuque+Looper 异步加载类 消息处理机制
- Android学习笔记(38):Handler消息传递处理机制
- Android中的Handler:接受子线程发送的数据, 并用此数据配合主线
- Android:异步处理之Handler、Looper、MessageQueue之间的恩怨(三)
- Android(安卓)之 Choreographer 详细分析