Android Handler浅析

15 篇文章 0 订阅

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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值