Handler运行机制源码学习

Handler运行机制源码解析

Handler是Android中用于处理线程中消息循环的机制,在一般的使用中,我们总是以Message作为消息载体,通过Handler发送处理消息,但是只是用还不够,我们还得知道它具体是怎么实现的,因此本文梳理了一下消息循环流程中Handler的具体实现。

1、主角介绍

①Handler:发送消息、回调处理消息

②MessageQueue:按顺序存储消息

③Looper:从消息队列取出消息通知Handler处理

④Message:存储消息

2、一般用法

3、流程概要

首先,我们把这个流程比作寄快递,Handler作为一个普通人,现在他要在北京Thread1处理业务,但是必须要在上海Thread2将东西送过来后才开始,所以它在上海Thread2将快递Message送到sendMessage()快递仓库MessageQueue,这个时候假如快递公司Looper里没有处理这条线路业务的小组,就开始组建prepare()专门送这条线路的业务小组,组建完成后开始让员工从仓库按顺序取件next(),并开始发快递loop(),当快递送到北京Thread1时Handler手中开始处理快递业务handleMessage()。

4、源码分析

(1)Handler

在Handler中一共提供了7个send方法,从图中可以看到无论是哪一个send方法最终都会去到enqueueMessage方法中,这个方法将message与当前Handler绑定,并且将message传递给了MessageQueue。

在Handler中还提供了5个post方法,但是这5个post方法最终走的都是send方法

(2)MessageQueue

在这个类中有两个比较重要的方法,一个是上面所说的enqueueMessage方法,它用于将一个Message放入到消息队列MessageQueue中,另一个是next方法它用于从消息队列MessageQueue中阻塞式地取出一个Message。

(3)Looper

快递Message已经存储了,那现在就需要将它送出去。

首先,看到Looper的构造方法,它是私有的,那就不能从外部就实例化Looper,那么我们什么时候实例化Looper呢,想想我们的是如何使用Looper的,没错就是prepare时。

在实例化Looper时创建了一个新的消息队列用来存储信息,在prepare时会判断当前线程时候已经拥有一个Looper,如果有将不能将实例化好的Looper加入sThreadLocal中,这就保证了一个线程只能拥有一个Looper,那这个sThreadLocal是什么呢

sThreadLocal它是一个Looper的集合而已,并且在ThreadLocal中我们可以看到,set方法在保存值的时候会将当前线程作为键将Looper作为值保存起来。

快递小组组建完成,接下来就要开始干活了。

我们在Looper中loop方法里需要注意的有三个地方,第一的地方说明了这是一个无限循环,这也就说明只要开启了loop,那么它就会一直从消息队列中取出消息即第二个地方,最后一个地方就是通知Handler进行回调的方法了,我们在上面有说过在Handler发送消息时绑定了Handler,这个target就是该Handler。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android handler机制是一种在Android中用于处理异步消息和线程通信的重要机制。其主要作用是将消息和任务抛到主线程的消息队列中,以便主线程按照一定的规则按照队列中的顺序处理这些消息和任务。 1. Handler的实例化:在Android中,创建一个Handler的实例可以通过以下两种方式实现: 直接实例化: 创建一个Hanlder对象,代码示例: Handler handler = new Handler(); 绑定Looper:在子线程中创建Handler的话,需要先通过以下代码获取Looper对象,然后再将其传入Handler的构造函数中: Looper looper = Looper.myLooper(); Handler handler = new Handler(looper); 2. Handler的使用:当一个线程需要将一个耗时的任务交给主线程去执行的时候,它可以使用Handler来完成。以下是Handler的常见用法示例: 使用Handler处理消息: Handler myHandler = new Handler() { public void handleMessage(Message msg) { //在这里处理消息 } }; Message msg = myHandler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("my_key", "my_string"); msg.setData(bundle); myHandler.sendMessage(msg); 使用Handler更新UI: Handler myHandler = new Handler() { public void handleMessage(Message msg) { //更新UI } }; myHandler.sendEmptyMessage(0); 3. Handler的原理:在Android系统中,所有的UI操作都必须在主线程上完成。这时,Handler就扮演了一个传递任务的中介角色。它把来自子线程的消息和任务封装成Message对象,最后以一定的顺序扔到主线程的消息队列中等待执行。主线程通过Looper不断地循环读取消息队列中的消息和任务,然后依次执行。这就是Handler机制的基本原理。 4. Handler配合其他机制使用:为了更好地发挥Handler的作用,还可与一些其他机制有效配合使用,例如:AsyncTask、MessageQueue等等。通过多种机制的相互配合,可以实现复杂的异步消息处理和并发控制,提升了Android应用程序的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值