异步消息处理-handler的四大组件和运作机制
在我们平常开发过程中,一提到异步消息处理机制,首先想到的就是Handler。Handler就是Android消息机制上层的一个接口,其实在开发中我们只和Handler打交道就可以了,很多人在看待Handler作用只是更新UI而已,但其实除了更新我们的UI界面,Handler还有很多其他的用处,比如说有一个场景或业务需求,在子线程中进行一些耗时操作,做完耗时操作之后通知主线程去更新UI,我们都知道Android系统已经限制了我们在子线程中是不可以直接去更新UI控件的,如果这样做会抛出异常。那么Handler其实就是Android SDK提供给开发者方便进行异步消息处理的类,或者说接口。
我们平时遇到的AsyncTask,Retrofit这些框架内部其实都用到了Handler,然后对他进行了巧妙地封装,所以说Handler的使用依然是核心
Handler的机制实现
先看一个简单的例子
🎃首先在主线程中创建了一个Handler对象
🎃然后在子线程中模拟一个耗时操作
然后通过sendEmptyMessage这个handler的用法来通知主线程中的handler执行相应的操作。
这里有一个疑问,如何通过handler,handler内部机制到底是怎么做的才能保证在子线程中发送的这个消息能通知到我们的主线程中然后去更新UI的操作呢?
🎃整个Handler中,handler中最重要的组件就是Message,Looper,MessageQueue,Handler。
Message:是handler接受和处理消息的对象。
Looper:每一个线程只能有一个Looper,它是线程持有,而在这个Looper当中,有一个方法,他能够读取MessageQueue消息队列中的消息,读到这个消息时会将这个消息取出,交给我们的handler进行消息的处理。
MessageQueue:消息队列。采用先进先出的方式管理我们的Message,Message就是handler处理的消息对象。当我们创建Looper对象的时候,他在looper的构造方法中会创建MessageQueue这个对象。
Handler:发送消息,处理消息。程序使用handler来发送消息,必须要被送到指定的MessageQueue消息队列中,否则消息就没有保存的地方。而MessageQueue消息队列是由Looper创建管理的,所以说如果你希望你的handler正常工作就必须在当前线程有一个Looper对象。
总结一下handler总体的工作机制:首先我们要在主线程创建的时候为主线程创建一个Looper,在创建Looper这个对象的同时,又会在Looper的内部创建一个消息队列MessageQueue这个对象。而创建handler的时候,我们会取出当前线程的Looper,然后通过这个Looper不断地去轮询消息队列MessageQueue当中的Message,然后handler在子线程中发送消息其实就是在MessageQueue这个消息队列中添加一条Message,最后通过Looper当中的消息循环取得消息队列当中的Message交给我们的handler进行处理。
(这些机制还是不够的,后面会分析handler的源码,从handler四大组件进行分析)