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

相关推荐
2501_915918411 小时前
掌握 iOS 26 App 运行状况,多工具协作下的监控策略
android·ios·小程序·https·uni-app·iphone·webview
2501_915909064 小时前
iOS 混淆实战,多工具组合完成 IPA 混淆与加固(源码 + 成品 + 运维一体化方案)
android·运维·ios·小程序·uni-app·iphone·webview
*才华有限公司*5 小时前
安卓前后端连接教程
android
氦客5 小时前
Android Compose中的附带效应
android·compose·effect·jetpack·composable·附带效应·side effect
雨白6 小时前
Kotlin 协程的灵魂:结构化并发详解
android·kotlin
我命由我123456 小时前
Android 开发问题:getLeft、getRight、getTop、getBottom 方法返回的值都为 0
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
Modu_MrLiu6 小时前
Android实战进阶 - 用户闲置超时自动退出登录功能详解
android·超时保护·实战进阶·长时间未操作超时保护·闲置超时
Jeled6 小时前
Android 网络层最佳实践:Retrofit + OkHttp 封装与实战
android·okhttp·kotlin·android studio·retrofit
信田君95276 小时前
瑞莎星瑞(Radxa Orion O6) 基于 Android OS 使用 NPU的图片模糊查找APP 开发
android·人工智能·深度学习·神经网络