本文讲解为何主线程可以 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() 。

 

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

更多相关文章

  1. android如何停止Thread和AsyncTask
  2. Hyper-V 上的android
  3. android 下动画结束时闪烁问题
  4. Android多线程--Handler
  5. Handler+Message+MessageQuque+Looper 异步加载类 消息处理机制
  6. Android学习笔记(38):Handler消息传递处理机制
  7. Android中的Handler:接受子线程发送的数据, 并用此数据配合主线
  8. Android:异步处理之Handler、Looper、MessageQueue之间的恩怨(三)
  9. Android(安卓)之 Choreographer 详细分析

随机推荐

  1. mysql使用小技巧
  2. oracle分布式事务总结
  3. 如何将所有插入调用标识到表中
  4. 将Excel表格多个Sheet表的数据转换为SQL
  5. SQL注入另类技巧
  6. 世界国家 的数据库sql
  7. mysql下载+安装+启动过程及问题解决
  8. Recordset记录集对象的属性
  9. SQL - 仅选择distinct一列
  10. Excel 复制Sql查询结果错位