Android Handler全面解刨

本文介绍了Android中Handler与Loop的消息处理流程。Looper.prepare()创建实例和消息队列,Looper.loop()循环读取消息,Handler关联消息队列并发送消息。还解答了Loop.loop()死循环为何不导致应用卡死的疑问,指出真正卡死原因是消息处理时间长。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

==============【流程】==============

【1】:Looper.prepare()会在本线程创建一个Loop实例,并在本线程创建并持有一个消息队列MessageQueue。一个线程对应只有一个消息队列。

【2】:Looper.loop()不断循环在MessageQueue里面读取消息,如果没有消息则会阻塞,有消息则会通过msg.target取出Handler,再通过target.dispathMessage()由Handler发消息发送出去。

【3】:创建Handler时,会取出当前线程的Looper实例,并持Looper的消息队列MessageQueue(),与之相关联。

【4】:Handler最终通过sendMessageAtTime()发消息时,会把Message的target赋值为Handler本身,然后把消息放进当前线程的MessageQueue,当Looper.loop()循环从消息队列里面取消息时,就会找到对应Message的target,然后由target调用dispatchMessage()把消息分发出去,其实dispatchMessage()就是Handler的一个方法,最终会调用handlerMessage()把消息最终下发到用户,这个handlerMessage()就是我们平常创建Handler实例时重写的那个接收消息的方法。

【5】:Handler().post()原理和Message是一样的,只是在dispatchMessage()方法里,会先判断Message的Runnable是否是空,如果是空就是调用handlerMessage方法,不为空就执行Runnable里面的代码。

==============【思考/疑问】==============

疑问1 :Loop.loop(),死循环读取数据,如果没有数据就会阻塞,为什么不会导致应用开发呢?

                  因为Android整个应用的运行,很多功能都是搭建在Loop的基础上的。比如Activity的生命周期方法的回调,都是在Loop.loop()的控制之下。如果Loop阻塞了,那应用就停止了。Loop就负责把从消息队列里把消息读取出来,根据消息做相应功能的回调相应。该回调onResume(),就回调相应Activity的onResume()。Loop死循环的意义,是不断从消息队列取出消息去执行相应的功能。真正会导致卡死的,是前面一个message处理的时间太长了,导致下一个message没有及时得到相应处理。如果消息队列是空的,Loop会阻塞在那里进入睡眠状态,这个时候其实是应用的一个静止状态,并没有交互。如果一个新的事件输入,比如一个Activity从后台回到前台。就会唤醒睡眠中的Loop,从消息队列里面读取这个消息,执行相应的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值