Android Looper源码阅读

看下Android Looper源代码,有助于理解Android系统消息循环流程、handler机制。Looper注释为class used to run a message loop for a thread, 即用于为一个线程运行消息循环, 或者说循环处理一个线程的消息。 Looper源码先看下这个类里的变量。

1、static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();

保存Looper对象,线程隔离,即每个线程最多只能有一个Looper对象。

2、private static Looper sMainLooper;

主线程的Looper对象

3、private static Observer sObserver;

观察者,一般用不到, 可以调试用。当即将处理消息,消息处理完,消息处理有异常时,会调用该观察者的相关方法。

4、final MessageQueue mQueue;

即消息队列。每个looper循环处理该队列中的消息。

5、final Thread mThread;

线程对象,该looper所属线程,即该looper处理哪个线程的消息。

6、private boolean mInLoop;

标识是否已启动消息循环

7、其他变量

private Printer mLogging;

private long mTraceTag;

private long mSlowDispatchThresholdMs;

private long mSlowDeliveryThresholdMs;

这些都是调试用,不用关注。

再下面看下Looper中的核心方法。

1、prepare方法

可见,prepare方法只能调用一次,用于生成Looper对象(Looper构造方法是私有的只能通过prepare方法生成Looper对象),并将其保存(关联)到当前线程。还为该Looper生成一个消息队列。传的quitAllowed参数表示消息队列是否可退出。

2、prepareMainLooper

用于生成主线程的Looper对象。应用开发用不到这个方法,用到主线程Looper直接获取就行。该方法是应用启动过程中调用的,如下:

3、getMainLooper

获取主线程Looper对象。上面说了,主线程Looper对象早就生成好了。子线程Looper对象才需要调用prepare方法生成。

4、myLooper

获取当前线程的Looper对象。为空就是没调用prepare方法。

5、myQueue

当前线程(或者说Looper)关联的消息队列

6、isCurrentThread

判断该Looper对象循环处理哪个线程的消息,是否为当前线程的。

7、quit

退出消息循环。只用于子线程。

8、getThread

获取当前Looper处理的哪个线程的消息。获取该线程对象

9、getQueue

获取该looper循环的消息队列

10、loop

为当前线程启动消息循环,循环处理消息。截图:

for语句里调用Message msg = queue.next(); // might block

这个方法从消息队列中获取消息。这里提示有可能阻塞当前线程。

中间有一些无关紧要的代码,打印调用过程的,或者调试的代码。略过。。。

然后,msg.target.dispatchMessage(msg);这一句代码是分发并处理消息。target即该消息关联的handler对象,此消息由该handler分发处理。

ok. Looper源码就这些, Looper注释中介绍了子线程怎样实现消息循环:

Ok. Handler、消息队列源码后续会另起一篇阅读。

相关推荐
2501_944525542 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
松☆4 小时前
Dart 核心语法精讲:从空安全到流程控制(3)
android·java·开发语言
_李小白5 小时前
【Android 美颜相机】第二十三天:GPUImageDarkenBlendFilter(变暗混合滤镜)
android·数码相机
小天源8 小时前
银河麒麟 V10(x86_64)离线安装 MySQL 8.0
android·mysql·adb·麒麟v10
2501_915921438 小时前
傻瓜式 HTTPS 抓包,简单抓取iOS设备数据
android·网络协议·ios·小程序·https·uni-app·iphone
csj509 小时前
安卓基础之《(20)—高级控件(2)列表类视图》
android
JMchen1239 小时前
Android计算摄影实战:多帧合成、HDR+与夜景算法深度剖析
android·经验分享·数码相机·算法·移动开发·android-studio
恋猫de小郭11 小时前
Flutter 在 Android 出现随机字体裁剪?其实是图层合并时的边界计算问题
android·flutter·ios
2501_9159184111 小时前
把 iOS 性能监控融入日常开发与测试流程的做法
android·ios·小程序·https·uni-app·iphone·webview
benjiangliu12 小时前
LINUX系统-09-程序地址空间
android·java·linux