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则有系统自动完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值