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常用方法就这些。

相关推荐
2301_771717212 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
dvjr cloi2 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
随遇丿而安5 小时前
第2周:`EditText` 不只是输入框,它是 Android 输入体验的第一道门
android
我命由我123455 小时前
Kotlin 开发 - lateinit 关键字
android·java·开发语言·kotlin·android studio·android-studio·android runtime
一起搞IT吧5 小时前
Android性能系列专题理论之十:systrace/perfetto相关指标知识点细节含义总结
android·嵌入式硬件·智能手机·性能优化
小书房10 小时前
Kotlin的by
android·开发语言·kotlin·委托·by
jinanwuhuaguo10 小时前
(第二十八篇)OpenClaw成本与感知的奇点——从“Token封建制”到“全民养虾”的本体论地基
android·人工智能·kotlin·拓扑学·openclaw
xxjj998a11 小时前
Laravel4.x核心特性全解析
android·mysql·laravel
JoshRen11 小时前
2026教程:在Android Termux中集成Gemini 3镜像站实现移动端文档自动处理与摘要生成(附国内免费方案)
android
诸神黄昏EX12 小时前
Android Google KEY
android