Handler后台异步更新UI的总结

看过书上介绍以及网上大牛们对源码的分析后,对Handler的用法以及原理也差不多了解了,所以梳理了一下异步更新UI的流程。

Handler介绍:

Hanlder是用来更新UI的一套机制,也是一套消息处理的机制,我们可以通过

它来发送和处理消息。

Message对象:



消息Message是仅是一个数据结构,是信息的载体,它与队列机制是无关的,封装着要执行的动作和执行动作的必要信息,what, arg1, arg2, obj可以用来传送数据;而Message的回调则必须通过Handler来定义,为什么呢?因为Message仅是一个载体,它不能自己跑到目标MessageQueue上面去,它必须由Handler来操作,把Message放到目标队列上去,既然它需要Handler来统一的放到MessageQueue上,也可以让Handler来统一定义处理消息的回调。需要注意的是同一个Message对象只能使用一次,因为在处理完消息后会把消息回收掉,所以Message对象仅能使用一次,尝试再次使用时MessageQueue会抛出异常。 


运行原理:


使用Handler时,Handler所在的线程必须有Looper存在,Handler在调用sendMessage时会把消息的target设为自己,然后加入到Looper中的消息队列中。在Looper.Loop()方法中,Looper从消息队列中得到一个消息后,会调用它的target的dispatchMesage函数,即最后又回到Handler的msg处理上来。


Handler使用post(Runnable)时原理与使用Message一样,就是将Runnable转换为Message而已。


总而言之,在子线程中更新UI的流程是:


1.UI线程中创建Handler(Looper在程序启动时已由系统创建)。
2.在子线程中将更新操作封装在Message中,然后调用主线程Handler的SendMessage方法,将Message从子线程发送到主线程的消息队列中。

3.主线程的Looper.Loop()方法从消息队列中将Message取出并执行其中的方法,完成UI的更新操作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值