当前位置: 首页 > news >正文

Android Handler源码阅读

先看下Handler的注释:

意思是,handler可以用于发送和处理消息和Runnable对象,该消息或Runnable对象关联一个线程的消息队列。每个handler对象关联到一个线程以及该线程的消息队列。当创建一个handler,该handler会被绑定到一个Looper对象。Handler可以把消息和Runnable对象传递到Looper的消息队列,并且将会在该Looper关联的线程中处理该消息或runnable对象。

Handler有俩个主要用途:

(1)在未来某个时间点处理消息或runnable对象。(即定时任务)

(2)将一个action(行动、要执行的动作)加入到其他线程的消息队列。(即跨线程通信)

下面看下常用方法:

1、handler构造方法有好几个。都差不多。无参构造方法会直接调用这个构造方法:

先是检查了Handler类是否会引起内存泄漏,这个先不管。然后获取当前线程保存的Looper对象(注:如果是子线程需先调研Looper.prepare())。获取该线程消息队列。以及保存callBack对象,保存是否异步(mAsynchronous这个变量可以先忽略)。

2、handleMessage

接受和处理消息,子类需实现该方法.

3、dispatchMessage

分发消息、处理消息。

(1)优先判断消息是否有callback,有的话,调用消息自己的callback的run处理该消息。

(2)消息没有callback,再判断如果handler有callback对象,调用该callback对象的handleMessage方法处理该消息。这个callback可以在实例化Handler的时候通过构造方法传递。

(3)不满足以上俩点,则调用handler自己的handleMessage处理消息。handleMessage方法在上面介绍了,空的,需要子类自己实现。

4、obtainMessage方法

这个方法有好几个重载方法,如下:

就看最后一个参数个数最多的那个。调用了Message.obtain(this, what, arg1, arg2); 生成消息。生成消息的方法在Message里,如下:

将handler对象传给了消息。当该消息被处理的时候,Looper对象会把该消息分发给该handler处理。(这一块源码详见Looper的loop方法。)

5、sendMessageDelayed方法

将消息插入到消息队列中。详细分析如下:

该方法直接调用sendMessageAtTime方法:

这里又直接调用enqueueMessage方法,代码如下:

消息的target对象设置为当前的handler对象,即该消息将来到处理时间的时候,由该handler处理该消息。然后调用消息队列的enqueueMessage方法,即将该消息插入到消息队列中(源码详见MessageQueue)。

6、post方法

这个方法也经常用。

(1)Runnable对象被用于生成Message对象,保存为该Message的callback对象。上面分析dispatchMessage方法时,已见到该callback何时调用,不赘述。

(2)然后调用sendMessageDelayed方法,将消息插入到消息队列,详见上面sendMessageDelayed方法介绍。

另,post方法还有这些方法,都差不多,不再赘述.

7、runWithScissors方法

标记为了hide,隐藏API,设计的很秒,有时间再单独研究下。

8、removeCallbacks

移除消息

9、hasMessage

检查消息队列中是否有这个消息

Ok. Handler常用方法就这些。

http://www.dtcms.com/a/410187.html

相关文章:

  • JavaWeb项目部署02(Docker)
  • VMware+RockyLinux+ikuai+docker+cri-docker+k8s+calico BGP网络 自用 实践笔记(底稿)
  • 意力机制 | 添加Deformable-LKA可变形大核注意力
  • Android Automotive OS架构
  • 企业网站访问量的第一来源是( )上海兼职网站制作
  • 《AI协同开发深潜:从架构迷雾到系统澄明的实战路径》
  • 专业的营销型网站建设企业方案项目策划书怎么写
  • 光环状态类型释义
  • Doris数据库-常用功能
  • MySQL中的空间碎片率计算分析
  • Python爬虫实战:获取东方财富网游戏板块数据与市场趋势分析
  • 【深度学习计算机视觉】07:单发多框检测(SSD)
  • 提取网站子页面邮箱文化馆建设网站
  • 大数据安全解决方案(PPT)
  • AI大模型学习(14)AI 小白入门!用 OpenCV+Python 打造人体姿态识别系统,超详细教程来了
  • 使用 Azure AD 实现认证与权限管理:原理解析与操作指南
  • 莆田网站建设收费标准广州金山大厦 网站建设
  • Lombok注解使用无效的情况(未能获得后端数据)
  • 网络原理-网络层
  • Flink 容错从状态后端到 Exactly-Once
  • 怎样做门窗网站网站首页被k还有救吗
  • 一体化DevOps平台选型新思维:如何打破研发与运维的壁垒?
  • 2025年14款DevOps理念的项目管理软件促进高效协同
  • 【音视频】pjsua2库:Account 用户注册详解
  • (Arxiv-2025)Lynx:迈向高保真个性化视频生成
  • 学习项目movie-web:构建本地电影、电视视频中心
  • QT音视频
  • Docker 安装 canal 详细步骤
  • 电子信息工程专业课《电路原理》:电子信息世界的基石与语言
  • 中学生做网站的软件狮山公司网站建设