最简洁系列介绍:对于理科生来说有条理的知识结构更便于记忆和学习与理解,比起无比详细的文章和成段的代码,知识框架更容易分析问题和定位问题。这系列的文章现在还在尝试阶段,如果您有好的意见,欢迎交流!
一、解决问题
1、理解Handler原理;
2、一个线程里面可以有多少个Looper,多少个消息队列,多少个Handler;
3、消息队列的结构;
4、消息队列没有消息的时候,Loope是什么状态;
5、延时消息的是怎么实现的;
6、当消息队列中没有Message时,线程是什么状态;
二、原理
1、整体逻辑:Handler通常用于线程之间通信,以子线程和主线程通信为例。 主线程默认会初始化一个Looper,Looper会不断的轮询它的消息队列。Handler中会有一个消息队列成员变量,它在那个线程中生成对象,就会将自己的消息队列指向相应线程Looper的消息队列,但他向自己的消息队列发送信时,相当于时向相应线程的消息队列发送消息;
2、消息逻辑
Handler原理.png
三、问题解决
1、一个线程中只有一个Looper,Looper的修饰是final ,生成Looper的构造方法是私有的,生成Looper通过调用Looper.prepare()方法,这个方法会先判断有无Looper,消息队列是在Looper中产生的,自然也就只有一个。Handler可以有多个,message成员变量target用于指向Handler,所以在发送的时候知道对应关系;
2、消息队列的结构是一个链表结构。Message中有一个next成员变量会指向下一个Message;
3、消息队列没有消息的时候会是阻塞状态,当有消息的时候会去唤醒;
4、当前消息的时间如果还没有到,会不发送,并且设置唤醒一个时间;
5、当消息队列没有消息时,线程会阻塞,没错是阻塞并且还是主线程,不要惊讶,为什么操作屏幕时不会卡顿,是因为屏幕的刷新也是通过Handler发送消息完成的,有消息来会重新唤醒线程。不要被阻塞吓住,如果不阻塞,主线程没事可干就结束了,主线程结束。。。。这你肯定没有遇到过吧!
四、应用
线程的之间的通信很多都适用Handler 例如异步任务,IntentService,HandlerThread,以后有机会会給大家出一系列最简单的介绍。
网友评论