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

相关推荐
骑驴看星星a2 小时前
【Three.js--manual script】4.光照
android·开发语言·javascript
TDengine (老段)9 小时前
TDengine 字符串函数 CONCAT_WS 用户手册
android·大数据·数据库·时序数据库·tdengine·涛思数据
会跑的兔子9 小时前
Android 16 Kotlin协程 第一部分
android·开发语言·kotlin
Meteors.10 小时前
安卓进阶——OpenGL ES
android
椰羊sqrt12 小时前
CVE-2025-4334 深度分析:WordPress wp-registration 插件权限提升漏洞
android·开发语言·okhttp·网络安全
2501_9160088912 小时前
金融类 App 加密加固方法,多工具组合的工程化实践(金融级别/IPA 加固/无源码落地/Ipa Guard + 流水线)
android·ios·金融·小程序·uni-app·iphone·webview
sun00770012 小时前
Android设备推送traceroute命令
android
来来走走13 小时前
Android开发(Kotlin) 高阶函数、内联函数
android·开发语言·kotlin
2501_9159214313 小时前
Fastlane 结合 开心上架(Appuploader)命令行版本实现跨平台上传发布 iOS App 免 Mac 自动化上架实战全解析
android·macos·ios·小程序·uni-app·自动化·iphone
雨白13 小时前
重识 Java IO、NIO 与 OkIO
android·java