总结 - Handler

1、ActivityThread UI线程
2、Message 消息
what: 区分消息
arg1和arg2传递int数据
obj传递对像
target目标Handler
3、MessageQueue 消息对队
负责管理消息队列,通过一个单链表的数据结构来维护
a.enqueueMessage 方法往消息列表中插入一条数据,
b.next 方法从消息队列中取出一条消息并将其从消息队列中移除
c.quit 方法退出消息列表,通过参数 safe 决定是否直接退出
4、Handler 消息发送与处理
5、Loop 消息循环 子线程中使用 Handler 则必须手动调用 Looper.prepare() 和 Looper.loop()
Loop可以通过quit和quitSafely退出

Android中为什么主线程不会因为 Looper.loop() 里的死循环卡死
每个 App 运行时前首先创建一个进程,该进程是由 Zygote fork 出来的,用于承载各种 Activity/Service 等组件,大多数情况一个 App 就运行在一个进程中

进程中会起一些线程,比如所谓的主线程 ActivityThread,线程是一段可执行的代码。当可执行代码执行完成后,线程生命周期便该终止了,线程退出。而对于主线程,我们是绝不希望会被运行一段时间,自己就退出,那么如何保证能一直存活呢?简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会被退出

ActivityThread 是应用程序的入口,这里你可以看到写Java程序时司空见惯的 main 方法,而 main 方法正是整个Java程序的入口。ActivityThread 的 main 方法主要就是做消息循环,一旦退出消息循环,那么你的程序也就可以退出了。

Android是事件驱动的,在Loop.loop()中不断接收事件、处理事件,而Activity的生命周期都依靠于主线程的Loop.loop()来调度,所以可想而知它的存活周期和Activity也是一致的。当没有事件需要处理时,主线程就会阻塞;当子线程往消息队列发送消息,并且往管道文件写数据时,主线程就被唤醒

主线程中的 Looper 从消息队列读取消息,当读完所有消息时,主线程阻塞。子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠。因此 loop 的循环并不会对 CPU 性能有过多的消耗。
真正会卡死主线程的操作是在回调方法 onCreate/onStart/onResume 等操作时间过长,会导致掉帧,甚至发生ANR,looper.loop 本身不会导致应用卡死

你可能感兴趣的:(总结 - Handler)