在非UI线程使用Handler进行线程通信时,一般都需要进行3个步骤:

创建Looper Looper.prepar()

创建Handler

启动消息循环Looper.loop()

通过这3步,基本就建立好了 Android 的多线程消息通信机制:

Handler

MessageQueue

Looper

Message

这几者可谓是你中有我,我中有你的存在。通过 Handler 发送 Message 到 Looper 的 MessageQueue 中,待 Looper 的循环执行到 Message 后,就会根据 Message 的 target handler,回调对应 Handler 的 handlerMessage 方法。

例如: Thread-A 拥有一个 Looper,Thread-B 持有一个在 Thread-A 中构造的 Handler,Thread-B 就可以通过这个 Handler 将 Message 发送到 Thread-A 的 Looper 的 MessageQueue 中,然后消息会走到 Thread-A 的 Handler 的 handleMessage 方法。

Looper 原理图

在 Looper 类加载时就会创建一个 ThreadLocal 类型的类变量 sThreadLocal

public final class Looper {

private static final String TAG = "Looper";

// sThreadLocal.get() will return null unless you've called prepare().

static final ThreadLocal sThreadLocal = new ThreadLocal();

Looper.prepar()

public static void prepare() {

prepare(true);

}

private static void prepare(boolean quitAllowed) {

if (sThreadLocal.get() != null) {

throw new RuntimeException("Only one Looper may be created per thread");

}

// 将构造的 looper 存到类变量 sThreadLocal 中

sThreadLocal.set(new Looper(quitAllowed));

}

private Looper(boolean quitAllowed) {

// 构建一个 messageQueue 成员

mQueue = new MessageQueue(quitAllowed);

// 将当前线程存入 mThread 中

mThread = Thread.currentThread();

}

在这里面主要执行了 3 步:

构建一个 looper

构建一个 messageQueue 成员

将当前线程存入 mThread 中

将构造的 looper 存到类变量 sThreadLocal 中

至此,执行 Looper.praper 的当前线程就会拥有一个 looper 成员了,存放在 Looper 的 sThreadLocal 中。

创建Handler

public Handler(Callback callback, boolean async) {

...

// 通过`Looper.myLooper()` 类方法获取 sThreadLocal 中储存的当前线程的 looper,将这个 looper 绑定到 handler 的成员变量 mLooper 中

mLooper = Looper.myLooper();

if (mLooper == null) {

throw new RuntimeException("Can't create handler inside thread that has not called Looper.prepare()");

}

// 将 mLooper 中的 messageQueue 绑定到 handler 的成员变量 mQueue 中

mQueue = mLooper.mQueue;

...

}

public static @Nullable Looper myLooper() {

return sThreadLocal.get();

}

Looper.loop()

声明一个局部常量final Loop me = myLoop()

myLoop()将返回当前线程的looper成员

声明一个局部常量final MessageQueue queue

将me.mQueue赋值给queue

进入无限循环

//进入无限循环

for (;;) {

//取出一条消息

Message msg = queue.next();

//没有消息就阻塞

if (msg == null) {

return;

}

...

//分发消息

try {

msg.target.dispatchMessage(msg);

//msg.target是一个Handler对象

} finally {

if (traceTag != 0) {

Trace.traceEnd(traceTag);

}

}

...

//回收消息

msg.recycleUnchecked();

通过Message.obtain()获取的消息,需要使用Handler.sendMessage()插入到消息队列。

通过Handler.obtainMessage()获取的消息,可以使用message.sendToTaget()插入到消息队列。

ZWave 中的消息队列机制

文章主题   在我们的日常编程中,对消息队列的需求非常常见,使用一个简洁.高效的消息队列编程模型,对于代码逻辑的清晰性,对于事件处理的高效率来说,是非常重要的.这篇文章就来看看 ZWave 中是通过什 ...

Android消息队列和Looper

1. 什么是消息队列 消息队列在android中对应MessageQueue这个类,顾名思义,消息队列中存放了大量的消息(Message) 2.什么是消息 消息(Message)代表一个行为(what ...

Android 消息分发机制

Android 中针对耗时的操作,放在主线程操作,轻者会造成 UI 卡顿,重则会直接无响应,造成 Force Close.同时在 Android 3.0 以后,禁止在主线程进行网络请求. 针对耗时或者 ...

Android开发学习—— 消息队列

###主线程不能被阻塞* 在Android中,主线程被阻塞会导致应用不能刷新ui界面,不能响应用户操作,用户体验将非常差* 主线程阻塞时间过长,系统会抛出ANR异常* ANR:Application ...

Android 开发笔记 “Android 的消息队列模型”

Android是参考Windows的消息循环机制来实现Android自身的消息循环的. Android通过Looper.Handler来实现消息循环机制,Android消息循环是针对线程的(每个线程都 ...

Android 的消息队列模型

Android 的消息队列模型 Android是参考Windows的消息循环机制来实现Android自身的消息循环的.    Android通过Looper.Handler来实现消息循环机制,Andr ...

Android HandlerThread 消息循环机制之源代码解析

关于 HandlerThread 这个类.可能有些人眼睛一瞟,手指放在键盘上,然后就是一阵狂敲.立即就能敲出一段段华丽的代码: HandlerThread handlerThread = new Ha ...

Window Azure ServiceBus Messaging消息队列技术系列1-基本概念和架构

前段时间研究了Window Azure ServiceBus Messaging消息队列技术,搞了很多技术研究和代码验证,最近准备总结一下,分享给大家. 首先,Windows Azure提供了两种类型 ...

跟我一起学WCF(1)——MSMQ消息队列

一.引言 Windows Communication Foundation(WCF)是Microsoft为构建面向服务的应用程序而提供的统一编程模型,该服务模型提供了支持松散耦合和版本管理的序列化功能 ...

随机推荐

【夯实PHP基础】UML序列图总结

android消息队列模型,Android 消息队列机制相关推荐

  1. 企业级工作流解决方案(七)--微服务Tcp消息传输模型之消息编解码

    Tcp消息传输主要参照surging来做的,做了部分裁剪和改动,详细参见:https://github.com/dotnetcore/surging Json-rpc没有定义消息如何传输,因此,Jso ...

  2. springboot集成阿里MNS消息队列发布订阅消息功能

    声明: 上一篇文章是springboot集成阿里ons发布订阅消息,此篇文章是mns发布订阅功能先简单记录一下ons与mns有什么区别 这里是在网上找的对比图: 此处为具体区别文章链接:点击打开链接 ...

  3. 【NVMe2.0b 6】NVMe 队列模型

    NVMe 队列模型 3.3NVM Queue Models 3.3.1基于内存的传输队列模型 3.3.1.1队列设置与初始化 3.3.1.2Queue的使用 3.3.1.2.1Completion Q ...

  4. 安卓+php推,使用 PHP 消息队列实现 Android 与 Web 通信

    需求描述很简单:Android 发送数据到 Web 网页上. 系统: Ubuntu 14.04 + apache2 + php5 + Android 4.4 思路是 socket + 消息队列 + 服 ...

  5. Android进阶知识树——Android消息队列

    1.概述 在安卓程序启动时,会默认在主线程中 运行程序,那如果执行一些耗时的操作则UI就会处于阻塞状态,出现界面卡顿的现象,再者用户的多种操作,系统是如何做到一一处理的,系统又是如何管理这些任务的,答 ...

  6. Android应用程序线程消息循环模型分析

    出自:http://blog.csdn.net/luoshengyang/article/details/6905587 我们知道,Android应用程序是通过消息来驱动的,即在应用程序的主线程(UI ...

  7. android 结束if循环_Android 消息机制(Handler + MessageQueue + Looper)

    Author:CrazyWah Date:2018.03.26 CopyRight:http://crazywah.com 禁止搬运!!!禁止搬运!!!禁止搬运!!! Android的消息机制主要由H ...

  8. Android进阶知识树——Android Handler消息机制

    1.概述 在安卓程序启动时,会默认在主线程中 运行程序,那如果执行一些耗时的操作则UI就会处于阻塞状态,出现界面卡顿的现象,再者用户的多种操作,系统是如何做到一一处理的,系统又是如何管理这些任务的,答 ...

  9. 消息队列 策略_消息模型:主题和队列有什么区别?

    首发公众号 可以看到,技术圈的风向一直在变,大数据.云的热度已经在慢慢消退,现在当红的是 AI 和 IoT.这些火热的概念,它最终要从论文和 PPT 落地,变成真正能解决问题的系统,否则就是一个空中楼 ...

最新文章

  1. 32岁健身教练转行程序员,拿到年薪76万offer
  2. nagios插件之登陆防火墙实现session监控
  3. 自己就是最好的投资标的
  4. 如何读群晖硬盘_更新教程:群晖下直接挂载WINDOWS的NTFS格式硬盘,试验通过......
  5. C语言课程设计---歌厅歌曲管理系统
  6. android source镜像源_【转载】Celadon快速上路指南Part2:编译Celadon镜像
  7. ApacheCN PythonWeb 译文集 20211110 更新
  8. 《中国机长》和《我和我的祖国》合计票房破31亿 两片贡献国庆档八成票房
  9. java 中aop 博客园_Java 10.Spring--AOP编程
  10. 转: Oracle AWR 报告 每天自动生成并发送邮箱
  11. [转]PHP FFI详解 - 一种全新的PHP扩展方式
  12. qq设置头衔显示服务器异常,qq头衔如何设置
  13. linux安装 jenkins(清华大学镜像站)
  14. SDM人脸对齐系列一:数据预处理
  15. ref、reactive、toRef、toRefs的区别
  16. 十分钟教会你们怎么开传奇
  17. python实现屏幕视频录制_Python实现屏幕录制功能的代码
  18. Java链表(基本操作)
  19. Cent OS 7命令积累(不定期更新)
  20. 试论and连接并列主语时的主谓一致

热门文章

  1. WPF and Silverlight 学习笔记(十四):键盘输入、鼠标输入、焦点处理[转]
  2. 转载 Android入门学习_代码常用布局
  3. ASP.NET会话(Session)保存模式
  4. linux下查看cpu信息
  5. XPath最通俗的教程(ZZ)
  6. 弄了个Gmail,觉得不适合我
  7. 创建list集合_Java 9新增的不可变集合
  8. java 数组 算法_常见算法总结 - 数组篇
  9. 精准设计类素材方向,搜索把握细节
  10. 霓虹促销电商设计,购买欲冲击视觉