Handler机制被广泛的应用在Android应用层、framework层来进行一些并发性操作;这其中一个典型的应用就是在 工作线程中post一个状态到UI线程 ;
Handler 介绍
这里主要从Handdler机制中的主要组成部分来进行说明;先看下类图
- 每个Thread拥有0或者1个Looper,并不是每个Thread都是从Looper派生。我们可以在我们想要用到Looper的地方先调用Looper.prepare(),在调用Looper.loop()来获得looper,或者直接使用HandlerThread。这里需要注意的是:Activity的main UI thread中的Looper是在Framework中已经被创建了,如果我们想要使用UI Thread的looper,则调用Looper.getMainLooper()即可
- 每个Looper拥有一个MessageQueue。Looper.loop()会轮询MessageQueue,一旦有消息来临就进行处理。
- Handler是用户能见到的,需要实现自己代码的一个类。Handler中主要包含
obtainMessage()
sendMessage()
handleMessage
等方法。任意一个Handler必须依附到一个Looper中。当调用sendMessage()
时,Message会被发送到Handler所持有的Looper的MessageQueue中去。用生产者/消费者模型来说:在这里Handler就像是一个生产者,Looper就是一个消费者。在这里需要注意的一点是sendMessage()
可以在任意的线程中调用,但是处理Message的代码例如handleMessage
则必须要运行在该Handler所持有的Looper中 一个Looper可以分配出多个Handlers,只要每个Handler处理各自类型的消息就可以啦。其实,当我们创建自己的Handler同主线程进行通信时,framework已经帮我们创建了很多的Handler来处理系统事件
ActivityThread::H() , ViewRootImpl::ViewRootHandler
每个Message必须有一个目标Handler,并且改目标Handler实现了
handleMessage()
接口。sendToTarget()
实际上是调用了mHandler.sendMessage(this);
使用Handler步骤
下图向我们展示了如何在代码中使用Handler
1. 创建一个Handler的子类,并实现handleMessage()
方法
2. msg = handler.obtainMessage(what)
从Handler的MessageQueue中获得mes对象。当然这一步通常我们使用的直接new Message()
3. handler.sendMessage(msg)/handler.sendToTarget()
将msg发送到handler的MessageQueue中
4. 由消息已经在MessageQueue中了,此时Looper的轮询机制就会轮询到了这个msg
5. 由looper将改msg发送给handler子类的handleMessage
方法处理
这里注意下,step1/step2/step3是通过我们在自己的代码实现,step4/step5则有系统自动完成