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相关推荐

  1. Android消息机制 Looper源码阅读

    什么是Looper android源码上Looper类的注释为: 用于为线程运行消息循环的类,在默认情况下线程是没有与其关联的消息循环的;可以通过在线程中调用Looper.prepare()创建一个与 ...

  2. Android 系统(177)---Android消息机制分析:Handler、Looper、MessageQueue源码分析

    Android消息机制分析:Handler.Looper.MessageQueue源码分析 1.前言 关于Handler消息机制的博客实际上是非常多的了. 之前也是看别人的博客过来的,但是过了一段时间 ...

  3. Android 进阶14:源码解读 Android 消息机制( Message MessageQueue Handler Looper)

    不要心急,一点一点的进步才是最靠谱的. 读完本文你将了解: 前言 Message 如何获取一个消息 Message.obtain() 消息的回收利用 MessageQueue MessageQueue ...

  4. Android消息机制Handler用法

    这篇文章介绍了Android消息机制Handler用法总结,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 1.简述 Handler消息机制主要包括: Messa ...

  5. android消息池,回转寿司你一定吃过!——Android消息机制(构造)

    消息机制的故事寿司陈放在寿司碟上,寿司碟按先后顺序被排成队列送上传送带.传送带被启动后,寿司挨个呈现到你面前,你有三种享用寿司的方法. 将Android概念带入后,就变成了Android消息机制的故事 ...

  6. android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码

    提起Android消息机制,想必都不陌生.其中包含三个部分:Handler,MessageQueue以及Looper,三者共同协作,完成消息机制的运行.本篇文章将由浅入深解析Android消息机制的运 ...

  7. Android 消息机制详解(Android P)

    前言 Android 消息机制,一直都是 Android 应用框架层非常重要的一部分,想更加优雅的进行 Android 开发,我想了解消息机制是非常必要的一个过程,此前也分析过很多次 Handler ...

  8. Android消息机制基本原理和使用

    在Android开发过程中,我们常常遇到子线程更新UI的需求,例如在子线程进行耗时较长的下载,等下载完成之后,再去更新UI,提示用户下载完成,直接在子线程里更新UI,会得到报错提示:Only the ...

  9. 理解 Android 消息机制

    本人只是Android小菜一个,写技术文章只是为了总结自己最近学习到的知识,从来不敢为人师,如果里面有不正确的地方请大家尽情指出,谢谢! 本文基于原生 Android 9.0 源码来解析 Androi ...

最新文章

  1. Objective-C NS_OPTIONS 类型的枚举
  2. Readline-select
  3. python当中的生成器
  4. 使用halcon结合机械XY轴对相机进行9点标定
  5. python对图片颜色校正_使用Python PIL更改图像色调
  6. git 怎么拉去分支代码_Git使用技巧1——代码写错分支了怎么办?
  7. 插件怎么用_【Anki插件篇】(01)插件介绍
  8. linux 4g 切换 有线网,4G和有线网络的自动切换
  9. Android常用Qualifiers(限定符)
  10. 浅谈NLP中的领域自适应(Domain Adaptation) 技术
  11. 山西等保测评机构项目测评收费价格标准参考
  12. Java项目中这样打印错误日志,排查问题更高效
  13. SVN怎么去掉版本控制,去除调svn绿色图标显示
  14. 操作系统管理计算机资源
  15. 使用docker急速搭建Oracle测试环境(完全离线)
  16. 什么是BlockingQueue
  17. 轨迹时空数据存储对比分析
  18. TCRT5000循迹模块原理及应用
  19. 关于抽象类说法以下哪些是正确的?
  20. 到底还要学什么才能成为2020年前端架构师!?(用图说话)

热门文章

  1. 速查 Git 常用命令
  2. cmd-bat批处理命令延时方法
  3. 华为手机浏览器不支持PUT提交方式的解决方案
  4. <input type=“file“> change事件异常处理办法
  5. 域账户登录时提示“你的账户配置不允许使用这台电脑。请试一下其他电脑” 解决方案
  6. Proxmox VE中出现TASK ERROR: command ‘apt-get update‘ failed: exit code 100的解决方法
  7. 终端启动tomcat报错 command not found 解决方法 (含启动和关闭命令)
  8. 如何在C中纯粹编写iOS应用程序
  9. 如何在Android中的ListView中延迟加载图像
  10. Win11开机桌面假死怎么办 win11开机桌面假死的解决方法