android Handler机制
1、什么是handler
Android提供更新UI的一套机制,也是一套消息处理机制,可以发送消息
2、为什么要用handler
Android提供的一套更新UI,消息传递机制,开发者要符合该机制才能更新UI
3、Handler用法
sendMessage
sendMessage(Long delay)
postDelayed(Runnable r, Long delay) —UI线程执行Runnable run方法
4、Handler机制好处
多线程更新UI存在多线程问题,最终导致界面混乱,如果加锁,不仅开发人员所有的UI操作需要考虑锁,还大大影响程序性能,最终用户感知差,google提供handler机制,开发人员无需关注多线程问题,只要按照handler机制更新UI即可,降低开发难度和提高产品开发效率。
5、Handler原理
Looper Message Handler之间的关系
Handler负责发送消息,Looper负责接收handler发出的消息,并回传给handler
Looper内中有一个MessageQueue ,用于存储消息
Activity由android 的ActivityThread 线程(main主线程)创建,使用ThreadLocal new Looper对象,创建Looper对象的时候又创建了MessageQueue
流程梳理
activity加载由ActivityThread 执行main方法,调用Looper.
Looper类的静态成员
sThreadLocal是静态的ThreadLocal,存储对象是当前线程的Looper,存储在ThreadLocalMap中
sMainLooper是UI的Looper全局对象
prepare(false) : (新建当前线性的Looper对象)

sThreadLocal set了Looper对象,new Looper(false) 执行:

Looper 的成员变量mQueue 指向new MessageQueue()
mThread 为当前主线程
sMainLooper 从ThreadLocal中获取之前的Looper对象,完成Looper的初始化操作。
Handler关联Looper和MessageQueue
Handler构造中获取之前创建的MainLooper对象,从MainLooper中获取MessageQueue
handler.sendMessage(Message msg)
处理流程
sendMessage(Message msg) — — > sendMessageDelayed(msg, 0) — —> sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis)
MessageQueue 的target属性指向当前handler的句柄
ActivityThread main中 执行了Looper.loop()
loop()
获取主线程Looper && Looper中的MessageQueue message中有handler send的消息
loop()中关键代码
for 死循环等待,不停的从queue中获取message
msg 的target为发送消息的handler对象,即调用handler的dispatchMessage方法
如果定义了callback拦截handler发送的消息(复写handMessage并返回true则只执行callback中的handMessage,不然执行Handler的handMessage方法),至此Hand处理流程基本逻辑处理完成。
6、自定义线程的handler
7、HandlerThread
HandlerThread 解决自定义Handler线程的多线程空指针问题,代码解析如下
getLooper() wait()方法 等待run中的Looper对象创建,不会产生空指针
HandlerThread demo