Android Handler机制初探

Handler机制被广泛的应用在Android应用层、framework层来进行一些并发性操作;这其中一个典型的应用就是在 工作线程中post一个状态到UI线程

Handler 介绍

这里主要从Handdler机制中的主要组成部分来进行说明;先看下类图
class diagram

  1. 每个Thread拥有0或者1个Looper,并不是每个Thread都是从Looper派生。我们可以在我们想要用到Looper的地方先调用Looper.prepare(),在调用Looper.loop()来获得looper,或者直接使用HandlerThread。这里需要注意的是:Activity的main UI thread中的Looper是在Framework中已经被创建了,如果我们想要使用UI Thread的looper,则调用Looper.getMainLooper()即可
  2. 每个Looper拥有一个MessageQueue。Looper.loop()会轮询MessageQueue,一旦有消息来临就进行处理。
  3. Handler是用户能见到的,需要实现自己代码的一个类。Handler中主要包含obtainMessage() sendMessage() handleMessage等方法。任意一个Handler必须依附到一个Looper中。当调用sendMessage()时,Message会被发送到Handler所持有的Looper的MessageQueue中去。用生产者/消费者模型来说:在这里Handler就像是一个生产者,Looper就是一个消费者。在这里需要注意的一点是 sendMessage()可以在任意的线程中调用,但是处理Message的代码例如handleMessage则必须要运行在该Handler所持有的Looper中
  4. 一个Looper可以分配出多个Handlers,只要每个Handler处理各自类型的消息就可以啦。其实,当我们创建自己的Handler同主线程进行通信时,framework已经帮我们创建了很多的Handler来处理系统事件

    ActivityThread::H() , ViewRootImpl::ViewRootHandler

  5. 每个Message必须有一个目标Handler,并且改目标Handler实现了handleMessage()接口。sendToTarget()实际上是调用了mHandler.sendMessage(this);

使用Handler步骤

下图向我们展示了如何在代码中使用Handler
step follow
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则有系统自动完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章