Tip | Android的消息机制

简介: Android的消息机制

底层要点简述

  • 首先,底层实现了一个线程本地存储,叫ThreadLocal区域,

一个主线程以及它对应的所有子线程,共享同一个 ThreadLocal对象,
这个ThreadLocal对象中可以说逻辑上维护着一个内存空间
这个内存空间为不同的线程一 一 对应地维护一套数据副本
每一套数据副本对应着一个线程
(有多少线程共享这个ThreadLocal对象,ThreadLocal对象就准备多少套数据副本),
每一套数据副本在这里可以具体化为一个Object数组

不同线程访问同一个ThreadLocal的get方法,
ThreadLocal内部会从(数据副本里)各自的线程中取出一个数组,
然后再从数组中根据当前ThreadLocal的索引去查找对应的value值。
比如对应线程的Looper,
ThreadLocal的索引值(key)就是 唯一的静态的Looper对象(ThreadLocal<Looper>对应)
value就是不同线程自己的Looper对象;
  • 而主线程及其所有子线程都可以开辟自己的Looper

每一个Looper都要绑定在一个Handler上,(如下方图1图2)
然后这些个每个单独的Looper
都是Looper对应线程共享的ThreadLocal中某一个数据副本中的一个项的value
这个项有keyvalue两部分,
value是刚说的每一个线程对应的Looper
key则是存放在ThreadLocal中一个唯一的静态的Looper对象(ThreadLocal<Looper>)了,(如下方图3)
然后这个唯一的静态的Looper对象了关联着一个MessageQueue

  • 也就是说,所有线程的Looper都映射到同一个Looper上,

所有线程的Looper中关联的MessageQueue也是映射到对应的同一个MessageQueue上;(如下方图1图2)


整个消息机制的工作流程常规表述

  • 首先在需要传递消息的地方,我们构造一个Message(消息)对象,

此时Message中会有自己的一个ID
然后我们把需要传递的数据设置在这个Message里面,
借助HandlersendMessage() 方法将Message传递到MessageQueue中,
此时MessageQueue通过调用MessageQueue.enqueueMessage()MessageQueue自身中添加这条发送过来的Message

  • MessageQueue(消息队列)中存放着诸多相关联的Handler发送过来的Message

其内部通过单链表的数据结构来维护消息列表,
等待Looper的抽取。

  • Looper(消息泵)通过Looper.loop() 不断轮询MessageQueue

调用MessageQueue.next(),从MessageQueue中抽取队头的Message
接着调用这个Message对应的HandlerdispatchMessage()
将该Message传递分发给对应的Handler

  • 目标Handler收到Message后调用handlerMessage()处理这个消息。

图0

可以看一下这篇博客给ThreadLocal的关键分析Android(Java) | 如何使程序实现线程安全(拓展分析:ThreadLocal、重排序、volatile/final)

附图

图1

Thread(线程):负责调度整个消息循环,即消息循环的执行场所。
存在关系:

  • 一个Thread只能有一个Looper,可以有多个Handler;
  • Looper有一个MessageQueue,可以处理来自多个Handler的Message;
  • MessageQueue有一组待处理的Message,这些Message可来自不同的Handler;
  • Message中记录了负责发送和处理消息的Handler;
  • Handler中有Looper和MessageQueue;

图2
图3

参考资料:

相关文章
|
9月前
|
前端开发 编译器 Android开发
构建高效Android应用:探究Kotlin协程的异步处理机制
【4月更文挑战第2天】在现代移动应用开发中,提供流畅且响应迅速的用户体验是至关重要的。随着Android平台的发展,Kotlin语言凭借其简洁性和功能性编程的特点成为了主流选择之一。特别地,Kotlin协程作为一种新型的轻量级线程管理机制,为开发者提供了强大的异步处理能力,从而显著提升了应用程序的性能和响应速度。本文将深入探讨Kotlin协程在Android中的应用,分析其原理、实现以及如何通过协程优化应用性能。
|
9月前
|
存储 Java Android开发
Android系统升级的机制概要
Android系统升级的机制概要
178 0
|
3月前
|
存储 安全 Android开发
探索Android与iOS的隐私保护机制
在数字化时代,移动设备已成为我们生活的一部分,而隐私安全是用户最为关注的问题之一。本文将深入探讨Android和iOS两大主流操作系统在隐私保护方面的策略和实现方式,分析它们各自的优势和不足,以及如何更好地保护用户的隐私。
|
4月前
|
消息中间件 存储 Java
Android消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
63 2
|
3月前
|
Linux Android开发 iOS开发
深入探索Android与iOS的多任务处理机制
在移动操作系统领域,Android和iOS各有千秋,尤其在多任务处理上展现出不同的设计理念和技术实现。本文将深入剖析两大平台在后台管理、资源分配及用户体验方面的策略差异,揭示它们如何平衡性能与电池寿命,为用户带来流畅而高效的操作体验。通过对比分析,我们不仅能够更好地理解各自系统的工作机制,还能为开发者优化应用提供参考。
|
3月前
|
算法 Linux 调度
深入探索安卓系统的多任务处理机制
【10月更文挑战第21天】 本文旨在为读者提供一个关于Android系统多任务处理机制的全面解析。我们将从Android操作系统的核心架构出发,探讨其如何管理多个应用程序的同时运行,包括进程调度、内存管理和电量优化等方面。通过深入分析,本文揭示了Android在处理多任务时所面临的挑战以及它如何通过创新的解决方案来提高用户体验和设备性能。
82 1
|
4月前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
4月前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
76 1
|
4月前
|
存储 安全 数据安全/隐私保护
探索安卓与iOS的隐私保护机制####
【10月更文挑战第15天】 本文深入剖析了安卓和iOS两大操作系统在隐私保护方面的策略与技术实现,旨在揭示两者如何通过不同的技术手段来保障用户数据的安全与隐私。文章将逐一探讨各自的隐私控制功能、加密措施以及用户权限管理,为读者提供一个全面而深入的理解。 ####
146 1
|
4月前
|
消息中间件 存储 Java
Android消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
110 2

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 7
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 10
    Android学习自定义View(四)——继承控件(滑动时ListView的Item出现删除按钮)