Handler运行机制详解

本文深入探讨Android中Handler的运行机制,涉及线程间通讯、Handler的两种交互形式、创建流程,以及Message、Message Queue、Looper、ThreadLocal五个关键部分的详解。Handler通过Message发送数据,Message Queue作为消息存储,Looper进行无限循环消息处理,ThreadLocal确保每个线程有唯一Looper副本,保证线程安全性。文章还提供了相关源码解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、android线程间的通讯,都是经过Handler在线程之间的切换。包括耗时任务的结果传送到UI线程等。

2、Handler使用包括2种形式,一种是主线程和子线程的交互,另外一种是子线程和子线程之间的交互。

3、Handler的创建,主线传入Looper.getMainLooper;如果是在子线程中创建,则需要在Looper.prepare(); 和 Loop.loop之间创建,否则会抛出异常。

4、Handler 的消息机制分为5个部分,Handler、message、Message Queue、Looper、ThreadLocal,以下将对此5部分分别进行详解。

  • Message,Message 是线程之间传递的消息,通过handler的sendMessage发送。message包含4个常用字段,what、arg1、arg2、obj。obj携带对象,其他的携带整形数据。

  • Message Queue:消息队列即是存储Handler发送的message存储的地方,message是通过一个单链表的结构来维护消息列表的,先进先出。每个线程只有一个Message Queue。Handler中的MessageQueue实际是Looper中定义的MessageQueue。

  • Looper:Looper的loop是一个无线循环,message queue中消息都是经过Looper无线循环中取出来的,直到消息队列为空;如果进来新的消息,因为Looper是个无线循环,可以马上取进来的message。

  • ThreadLocal:Looper中定义了TheadLocal,每个线程保持了一个Looper副本,因此Looper对线程是唯一的。ThreadLocal是创建线程局域变量,即是每个线程中创建数据的一个副本。那么本数据副本只对本线程可见,就解决了多线程问题。ThreadLocal应用场景为数据库链接、Session链接。ThreadLocal详解请见以下链接:

  • http://blog.youkuaiyun.com/wangqiubo2010/article/details/79465619
  • Handler消息处理机制见下图。

这里写图片描述

根据以上的总结,以下将通过源码对Handler进行详细讲解。

  • Handler的消息机制分为5个部分,Handler、message、Message Queue、Looper、ThreadLocal,其定义如下:
    这里写图片描述
    这里写图片描述

这里写图片描述

  • Looper是Handler的消息机制的关键属性,其源码解析其功能如下:
    这里写图片描述
    这里写图片描述

这里写图片描述

  • MessageQueue的异步解析,通过以下备注可知,异步脱离了Looper维护Handler消息处理的顺序性的本质,提示谨慎使用,因此这个异步标志很少会用到。
    这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值