android消息机制—Looper
Looper在android的消息机制充当消息循环的角色,它不停的充MessageQueue中拿出消息,并将消息交给Hanlder处理,下面是他的常用方法解析。
项目源码
Looper的创建
1. android主线程在创建的时候会主动创建一个Looper
ActivityThread是android的主线程,在该类的main函数中有如下部分代码
public static void main(String[] args) {...//创建LooperLooper.prepareMainLooper();ActivityThread thread = new ActivityThread();thread.attach(false);...
}
复制代码
Looper.prepareMainLooper()方法的代码部分代码:
public static void prepareMainLooper() {//调用Looper的prepare()方法创建Looperprepare(false);...
}
复制代码
从上面的信息我们可以知道,ActivityThread的main函数调用了Looper.prepareMainLooper函数,而在prepareMainLooper函数中有调用了Looper的prepare来创建Looper。那么prepare函数是如何创建Looper呢?我们看下面第二中方式来分析。
2. 在子线程中直接使用Looper.prepare()方法创建
private static void prepare(boolean quitAllowed) {//一个线程中只能有一个Looperif (sThreadLocal.get() != null) {throw new RuntimeException("Only one Looper may be created per thread");}//创建LoopersThreadLocal.set(new Looper(quitAllowed));
}
复制代码
在线程中我们可以调用Looper.prepare,这个函数中 sThreadLocal.set()中创建一个Looper,该方法不仅创建了Looper,其实也创建了MessageQueue,以及将Looper将当前线程和Looper关联起来了。我们看一看Looper的构造就明白了
private Looper(boolean quitAllowed) {//创建消息队列mQueue = new MessageQueue(quitAllowed);//获取当前线程的引用mThread = Thread.currentThread();
}
复制代码
Looper的的Loop方法
该方法主要是用来从消息队列里面拿出消息。我们可以看下面的部分源码
public static void loop() {...final MessageQueue queue = me.mQueue;...for (;;) {Message msg = queue.next(); // might blockif (msg == null) {return;}... try {//调用handler处理消息msg.target.dispatchMessage(msg);end = (slowDispatchThresholdMs == 0) ? 0 :SystemClock.uptimeMillis();} finally {if (traceTag != 0) {Trace.traceEnd(traceTag);}}...}
}
复制代码
从上面的部分代码中loop()函数里面有一个无限循环,这个循环就是不停的从MessageQueue中取消息,并将取出消息交给handler的dispatchMessage()来处理,只有当queue.next()取得Message为null的时候才跳出循环。
Looper其他常用方法
//获取当前线程的Looper
Looper looper = Looper.myLooper();
//获取主线的Looper
Looper mainLooper = Looper.getMainLooper();
//清除全部消息
looper.quit();
//清除延迟消息
looper.quitSafely();
复制代码
android消息机制—Looper相关推荐
- Android消息机制 Looper源码阅读
什么是Looper android源码上Looper类的注释为: 用于为线程运行消息循环的类,在默认情况下线程是没有与其关联的消息循环的;可以通过在线程中调用Looper.prepare()创建一个与 ...
- Android 系统(177)---Android消息机制分析:Handler、Looper、MessageQueue源码分析
Android消息机制分析:Handler.Looper.MessageQueue源码分析 1.前言 关于Handler消息机制的博客实际上是非常多的了. 之前也是看别人的博客过来的,但是过了一段时间 ...
- Android 进阶14:源码解读 Android 消息机制( Message MessageQueue Handler Looper)
不要心急,一点一点的进步才是最靠谱的. 读完本文你将了解: 前言 Message 如何获取一个消息 Message.obtain() 消息的回收利用 MessageQueue MessageQueue ...
- Android消息机制Handler用法
这篇文章介绍了Android消息机制Handler用法总结,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 1.简述 Handler消息机制主要包括: Messa ...
- android消息池,回转寿司你一定吃过!——Android消息机制(构造)
消息机制的故事寿司陈放在寿司碟上,寿司碟按先后顺序被排成队列送上传送带.传送带被启动后,寿司挨个呈现到你面前,你有三种享用寿司的方法. 将Android概念带入后,就变成了Android消息机制的故事 ...
- android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码
提起Android消息机制,想必都不陌生.其中包含三个部分:Handler,MessageQueue以及Looper,三者共同协作,完成消息机制的运行.本篇文章将由浅入深解析Android消息机制的运 ...
- Android 消息机制详解(Android P)
前言 Android 消息机制,一直都是 Android 应用框架层非常重要的一部分,想更加优雅的进行 Android 开发,我想了解消息机制是非常必要的一个过程,此前也分析过很多次 Handler ...
- Android消息机制基本原理和使用
在Android开发过程中,我们常常遇到子线程更新UI的需求,例如在子线程进行耗时较长的下载,等下载完成之后,再去更新UI,提示用户下载完成,直接在子线程里更新UI,会得到报错提示:Only the ...
- 理解 Android 消息机制
本人只是Android小菜一个,写技术文章只是为了总结自己最近学习到的知识,从来不敢为人师,如果里面有不正确的地方请大家尽情指出,谢谢! 本文基于原生 Android 9.0 源码来解析 Androi ...
最新文章
- Objective-C NS_OPTIONS 类型的枚举
- Readline-select
- python当中的生成器
- 使用halcon结合机械XY轴对相机进行9点标定
- python对图片颜色校正_使用Python PIL更改图像色调
- git 怎么拉去分支代码_Git使用技巧1——代码写错分支了怎么办?
- 插件怎么用_【Anki插件篇】(01)插件介绍
- linux 4g 切换 有线网,4G和有线网络的自动切换
- Android常用Qualifiers(限定符)
- 浅谈NLP中的领域自适应(Domain Adaptation) 技术
- 山西等保测评机构项目测评收费价格标准参考
- Java项目中这样打印错误日志,排查问题更高效
- SVN怎么去掉版本控制,去除调svn绿色图标显示
- 操作系统管理计算机资源
- 使用docker急速搭建Oracle测试环境(完全离线)
- 什么是BlockingQueue
- 轨迹时空数据存储对比分析
- TCRT5000循迹模块原理及应用
- 关于抽象类说法以下哪些是正确的?
- 到底还要学什么才能成为2020年前端架构师!?(用图说话)
热门文章
- 速查 Git 常用命令
- cmd-bat批处理命令延时方法
- 华为手机浏览器不支持PUT提交方式的解决方案
- <input type=“file“> change事件异常处理办法
- 域账户登录时提示“你的账户配置不允许使用这台电脑。请试一下其他电脑” 解决方案
- Proxmox VE中出现TASK ERROR: command ‘apt-get update‘ failed: exit code 100的解决方法
- 终端启动tomcat报错 command not found 解决方法 (含启动和关闭命令)
- 如何在C中纯粹编写iOS应用程序
- 如何在Android中的ListView中延迟加载图像
- Win11开机桌面假死怎么办 win11开机桌面假死的解决方法