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

相关推荐
robotx6 分钟前
安卓线程相关
android
消失的旧时光-194327 分钟前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon1 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon1 小时前
VSYNC 信号完整流程2
android
dalancon2 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013843 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android3 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才4 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶4 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle
汪海游龙5 小时前
开源项目 Trending AI 招募 Google Play 内测人员(12 名)
android·github