Android Handler全面解刨

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

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

【2】:Looper.loop()不断循环在MessageQueue里面读取消息,如果没有消息则会阻塞,有消息则会通过

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,从消息队列里面读取这个消息,执行相应的功能。

猜你喜欢

转载自blog.csdn.net/Leo_Liang_jie/article/details/90479216