【知识】Handler相关
原创不易,尊重作者,转载请注明出处
目录
- Handler原理
- 子线程一定不能更新UI吗
- Handler内存泄露
- 一个线程是否可以创建多个Handler
- Handler与Looper的关系
Handler原理
handler原理主要可以通过5个类和3个步骤来讲清楚。
5个类
Message:消息,包含了消息ID、消息处理对象以及处理的数据。
Handler:处理者,负责Message的发送和处理,在使用Handler时,需要实现handleMessage方法来对特点的Message进行处理。
MessageQueue:消息队列,用来存放Handler发送过来的消息,遵循先进先出的原则,将Message以链表的方式串联起来,等待Looper抽取。
Looper:消息泵,不断从MessageQueue中抽取Message执行。
Thread:线程,负责调度整个消息循环。
3个步骤
Handler创建消息:Handler创建消息时首先查询消息池中是否有消息存在,如果有消息存在,直接从消息池中取出,如果没有消息存在,则会重新初始化一个消息实例。
Handler发送消息:Handler通过sendMessage发送消息时,UI主线程会判断是否创建过Looper,如果没有创建过Looper,会通过ThreadLocal创建一个Looper,如果创建过Looper,则直接使用ThreadLocal之前创建的Looper,当Looper创建的时候会创建一个消息队列MessageQueue,消息队列会存放Handler发送的消息。
Handler处理消息:UI主线程会通过Looper循环查询消息队列MessageQueue,当发现有消息存在时会将消息取出,然后分析消息的参数,判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。
结论
通过以上5个类和3个步骤,基本可以理解Handler的原理。
子线程一定不能更新UI吗
不是。大多数情况下,子线程是不能更新UI的,但是以下两种情况,子线程可以更新UI。
支持在子线程更新UI的控件
在Android中,有支持在子线程中更新UI的控件,例如:SurfaceView。
在特定的生命周期可以实现子线程更新UI
在Activity的onResume生命周期之前,是可以在子线程中更新UI的。
Handler内存泄露
请参考我的另一篇文章:
内存泄露
一个线程是否可以创建多个Handler
可以。
Handler与Looper的关系
Handler与Looper的关系可以理解成Handler、MessageQueue、Looper的关系,在一个线程中,结构是一个Looper、一个MessageQueue和多个Handler。