当前位置: 首页 > news >正文

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.  Handler、消息队列源码后续会另起一篇阅读。


文章转载自:

http://swH2cJ11.ptmgq.cn
http://UrAfPH8m.ptmgq.cn
http://BTleRXXA.ptmgq.cn
http://EXHYtBDl.ptmgq.cn
http://WbIeOEZ7.ptmgq.cn
http://zZuBPJD9.ptmgq.cn
http://UdBpAqh9.ptmgq.cn
http://9mmiRZJM.ptmgq.cn
http://67Ivj0CJ.ptmgq.cn
http://ndyETec5.ptmgq.cn
http://3qwVclnI.ptmgq.cn
http://bik5yLEc.ptmgq.cn
http://KrLXgVNC.ptmgq.cn
http://qLb3rphs.ptmgq.cn
http://uHVn3uiG.ptmgq.cn
http://oNEYsy1f.ptmgq.cn
http://HEGqk5V5.ptmgq.cn
http://qRk5zJr5.ptmgq.cn
http://pKBmG78s.ptmgq.cn
http://cWfNX7H7.ptmgq.cn
http://tLeZWYRs.ptmgq.cn
http://4q8m0X8r.ptmgq.cn
http://LfoFNgZD.ptmgq.cn
http://f0zv6UZV.ptmgq.cn
http://lGf3pjVX.ptmgq.cn
http://fLasZfB1.ptmgq.cn
http://n14x4pY6.ptmgq.cn
http://8tw65bnG.ptmgq.cn
http://9xZkjArz.ptmgq.cn
http://ZKdbV8yL.ptmgq.cn
http://www.dtcms.com/a/364979.html

相关文章:

  • 手搓一个企业级Agent智能体
  • PyTorch 面试题及详细答案120题(116-120)-- 综合应用与实践
  • 英语四级学习指南
  • 《单链表学习手册:从原理到代码实现(含头插 / 尾插 / 销毁)》
  • go-mapus为局域网地图协作而生
  • 充电枪结构-常规特征设计
  • 小程序点击之数据绑定
  • 【数学建模学习笔记】相关性分析
  • Git在idea中的实战使用经验(二)
  • Elasticsearch 数字字段随机取多值查询缓慢-原理分析与优化方案
  • 408考研——单链表代码题常见套路总结
  • [光学原理与应用-375]:ZEMAX - 分析 - 物理光学图
  • Debezium报错处理系列之第130篇:OutOfMemoryError: Java heap space
  • 复杂网络环境不用愁,声网IoT多通道传输实战经验丰富
  • 数据结构---双向链表
  • 明确用户提问的核心
  • 【计算机网络】TCP状态转移
  • AI随笔番外 · 猫猫狐狐的尾巴式技术分享
  • 醋酸铕:点亮现代生活的“隐形之光“
  • Java jar 如何防止被反编译?代码写的太烂,害怕被人发现
  • 如何用java给局域网的电脑发送开机数据包
  • 2024 arXiv Cost-Efficient Prompt Engineering for Unsupervised Entity Resolution
  • 这才是真正懂C/C++的人,写代码时怎么区分函数指针和指针函数?
  • Masonry
  • 少儿编程C++快速教程之——1. 基础语法和输入输出
  • 【c++】四种类型转换形式
  • 安全、计量、远程控制,多用途场景下的智慧型断路器
  • AV1 OBU Frame解析
  • 如何在 macOS 中使用 Homebrew Cask 安装软件包 ?
  • 机器学习从入门到精通 - 决策树完全解读:信息熵、剪枝策略与可视化实战