Android消息机制一

Crosswalk运行库安装包 Crosswalk 用于替换由于android版本不同导致的webview中行为的不一致性,使用crooswalk 可以得到一致的行为反应 立即下载

初学Android,不可避免会出现许多错误,如果因为文章中的错误而对您造成了困扰,万分抱歉,欢迎您在评论区指正。

Handler是Android消息机制的上层接口。

通过这个接口可以很方便的将消息切换到Handler所在的线程中去执行。Android开发工程师通常用它来更新UI,但是如果只认为它的作用是用来更新UI的话,未免将Handler的功能过于简单化。我甚至认为,Handler是我们Android应用的心脏,如四大组件的启动和停止都会使用到Handler,所以,Handler的重要性不言而喻。

  • 为什么UI更新要在主线程中:ViewRootImpl中会进行checkThread操作,所以不能在子线程中更新UI,提示,ViewRootImpl是在onResume之后才变得可见的,之前的过程是没有线程检查的。
  • 主线程负责更新,子线程负责耗时操作,能够大大提升响应效率。
  • 如果在不同的线程去控制用一个控件,由于网络延时或者大量耗时操作,会使UI绘制错乱,出了问题也很难去排查到底是哪个线程更新时出了问题。
  • UI线程非安全线程,非线程安全不能加Lock线程锁,否则会阻塞其他线程对View的访问,效率就会变得低下。

Handler的工作是要与Looper与MessageQueue配合使用,所以,我们就要在有Looper的线程中创建Handler,或者在有Handler的线程中创建Looper。

  • 我们在UI线程中为什么不需要创建Looper呢?那是因为当App启动时Looper已经自动创建了。我们只要找到App的入口函数,就可以看到Looper的创建过程了。众所周知,一段Java代码的入口函数是main()方法,而Android的main()函数在ActivityThread这个类里。
    在这里插入图片描述

    我们可以看到,在main()函数中有这么一行代码Looper.prepareMainLooper();我们的主线程就是在这里开启Looper的。有兴趣的同学可以自己看一看。

介绍Handler之前,我们还得再介绍一个比较重要的东西ThreadLocal,它并不是线程,它的作用是用来保证我们在不同线程中获取数据时,拿到的是自己线程中存储的数据,而Handler中的ThreadLocal中存储的就是每个线程中的Looper。ThreadLocal中的数据是以线程为作用域的,在不同的线程中取到的都是自己线程中的数据,而不是同一个数据的副本,在多线程环境下,可以防止自己的变量被其他线程篡改。不采用ThreadLocal的话,其实可以维持一个全局的HashMap来指定查询对应线程下的值,对于Handler来说,就是对应线程下的Looper。

要了解ThreadLocal,首先要了解ThreadLocalMap,ThreadLocalMap是ThreadLocal的内部类,其实,ThreadLocal并不存储数据,只是提供对ThreadLocalMap的操作,ThreadLocalMap才是真正存数据的地方。具体过程是,Thread为每个线程创建一个ThreadLocalMap,ThreadLocalMap里面有一个Entry类型的数组,用来存每个Entry,而Entry是什么呢?它又是ThreadLocalMap里面的一个静态内部类,它通过自己的构造函数将ThreadLocal和数据按照键值对的形式存下来,至于Entry在数组中如何存储,是根据ThreadLocal的哈希值与数组长度-1进行与运算,得到 i 值,i 就是数组的下标,具体逻辑如下:

在这里插入图片描述

我们看for循环里干的事情,用 i 在这个数组中取值,如果有值并且得到的 key 就是你要设置value的key,就直接设置值然后返回,有值但 key 为 null 了,就更新为新的。那如果有值,key也不为 null,也不与新的 key 相同呢?那就将 i + 1;直到找到一个符合的位置。这样,那我们也可以知道get方法的具体操作了。到这里,我们已经了解了数据隔离的本质了,总结来说,就是每个线程会维护属于自己线程的ThreadLocalMap,而存数据是使用到的ThreadLocal是你要存数据的键,根据这个键,你可以在不同的线程中的ThreadLocalMap取到不同的值,从而形成数据隔离。其实,对象都是存储在堆上的,只是通过了一些技巧修改了数据的可见性。

至此,我们理解ThreadLocal中的get/set方法就很容易了。

首先是ThreadLocal的get方法:

在这里插入图片描述

先拿到当前线程 t,再通过 t 取到当前线程中的ThreadLocalMap,在ThreadLocalMap中通过 this 也就是ThreadLocal取到对应的 e,调用 e.value 取到想要的值,over。

再看set方法:

在这里插入图片描述

emmmm…经过我们上面的分析,这个方法极为清晰,就不说了。

参考:
https://juejin.cn/post/6854573219916021767#heading-1
《Android开发艺术探索》

0032期基于深度学习的大米识别-含数据集 083基于深度学习的手势识别小程序版本_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResNet、ResNeXt、ShuffleNet、VGG、EfficientNet和Swin transformer等10多种模型。117nlp自然语言处理-文本情感分类-joy-sadness-anger-fear-love-surprise。运行02深度学习模型训练.py就会将txt文本中记录的训练集和验证集进行读取训练,训练好后会保存模型在本地。 阅读详情

相关推荐

19-5 ACC 自适应巡航控制系统需求

本专题由深圳季连AIgraphX李博及团队出品,主要讲解ACC自适应巡航控制系统的开发与仿真测试。具体说来,包括ACC标准/法规分析、系统需求、系统架构、软件需求、软件架构、算法建模、验证场景分析、仿真实验搭建等内容。 本节主要讲ACC系统需求。

AIgraphX 1090

android p开机检查data,Android 查看/data/data文件夹并取回文件

前言在开发Android过程中,经常需要从设备中取回文件,而Android为了安全考虑,其中的/data/data路径下的文件通常是不可见的。本文将介绍如何修改该文件夹的权限并取回数据,以及其中可能遇到的问题。第一步:确保手机已经Root这一步非常关键,也没有什么技术含量,现成的Root工具很多,直接拿来用就好了(什么,你要自己写?大牛慢走,不送)。这里要注意,选用Root工具的时候一定要谨慎,尽...

weixin_42312227的博客 1275

华为防火墙USG6600全流量日志配置指南:从流量监控到NAT日志的完整方案

本文详细介绍了华为USG6600防火墙全流量日志配置方案,涵盖流量监控、NAT日志及安全事件溯源等核心功能。通过精细化配置和性能优化技巧,帮助企业构建高效、合规的日志体系,提升网络安全运维效率。文章特别强调了日志采样与字段过滤的实用方法,适用于高流量环境下的资源优化。

gin88的博客 350

Android 关于时间的处理

CountDownTimer是一个倒计时的类,还可以指定时间间隔定期通知,举个栗子,比如说你倒计时是100秒的,可以指定每20秒通知一次,这样开始的时候会回调一次,20秒时会回调一次,40秒时会回调一次…,200秒时的回调和时间间隔的回调不同方法的。 常用方法: cancel() 取消倒计时 onFinish() 时间到了,就会触发回调。 onTick 定期间隔触发回调 start() 开...

yangjunjin的博客 817

别再搞混了!MATLAB通信仿真中EbN0转SNR的保姆级公式推导与避坑指南

本文深入解析MATLAB通信仿真中EbN0与SNR转换的核心公式,揭示数字仿真与理论系统的关键差异。通过真实案例展示错误参数设置导致的隐蔽问题,并提供完整的参数自查清单和正确实现代码,帮助工程师和学生避免常见错误,确保仿真结果准确可靠。

weixin_28746223的博客 348

set_data_check专题[使用,report_timing,setup/hold检查]

set_data_check用于约束『数据-对-数据』的『建立保持』时间检查,通常被称为非时序约束 ( non-sequential constraints ), 理论上set_data_check 可以设在任意的两个data pin 上,其中一个pin 称为 constrained pin 类似于寄存器的data pin, 另一个pin 称为related pin 类似于寄存器的clock pin.

cy413026的博客 1万+

android data data 目录,Android怎么在系统的data目录下创建文件夹,不是data/data目录

java code:Process proc = null;try {Runtime runtime = Runtime.getRuntime();proc = runtime.exec(command);} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}需要的导入的包可以用eclip...

weixin_42405503的博客 1755

手把手教你用Ubuntu 22.04的附加驱动工具安装NVIDIA显卡驱动(含常见错误修复)

本文详细介绍了在Ubuntu 22.04系统上,如何通过图形化的“附加驱动”工具安全、便捷地安装NVIDIA显卡驱动。内容涵盖从准备工作、禁用默认的nouveau驱动、图形界面安装实操,到安装后的验证(如使用nvidia-smi命令),并提供了安装失败黑屏、亮度调节失效等常见问题的深度解决方案,帮助用户彻底搞定驱动安装难题。

weixin_29248653的博客 602

android关于data/data/目录下,各应用之间的私有数据读写

下面简单介绍一下,我的方法,可能有点笨拙。 我主要用的是Context.openFileOutput()和Context.openFileInput()方法。 测试部分,被用到的应用先存入一个文件,做好被调用准备。代码如下: //定义文件的名称 String oldfileName = "/data/data/com.data.datatest/files/hy.txt"

hy295683872的专栏 2824

30天入门 SAP BTP 开发系列之四:SAP BTP 控制台里 Global Account 的常规操作介绍

笔者前一篇文章,介绍了 SAP BTP 中 Global Account 的概念。本文咱们一起来看看 SAP BTP 控制台里,给 Global Account 开放了哪些操作功能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 872

RV1126 ISP调参实战:3A算法参数调节的7个技巧

││ │ DEMOSAIC (去马赛克) │ ││ │ GAMMA (Gamma 校正) │ ││ │ DPC (坏点校正) │ ││。

小灰灰的博客 670

聊一聊 Android 的消息机制

在 Android 平台上,主要用到两种通信机制,即 Binder 机制和消息机制,前者用于跨进程通信,后者用于进程内部通信。从技术实现上来说,消息机制还是比较简单的。从大的方面讲,不光是 Android 平台,各种平台的消息机制的原理基本上都是相近的,其中用到的主要概念大概有:1)消息发送者;2)消息队列;3)消息处理循环。示意图如下:图中表达的基本意思是,消息发送者通过某种方式,将消息发送到某个消息队列里,同时还有一个消息处理循环,不断从消息队列里摘取消息,并进一步解析处理。

learnframework的博客 1287

Android Framework SurfaceFlinger面试题及参考答案

请简述 SurfaceFlinger 在 Android 系统中的作用。 SurfaceFlinger 是 Android 系统中一个非常关键的服务。它主要负责将多个应用程序的 Surface 合成到一个屏幕显示内容中。 从应用程序的角度来看,每个应用都有自己的 UI 界面,这些 UI 界面实际上是由一系列的图层(Surface)构成。例如,一个应用可能有背景图层、按钮图层、文本图层等。应用通过向 SurfaceFlinger 提供这些 Surface 来请求显示。 SurfaceFl

大模型大数据攻城狮的专栏 1187

聊一聊Android的消息机制

从技术实现上来说,消息机制还是比较简单的。从大的方面讲,不光是Android平台,各种平台的消息机制的原理基本上都是相近的。 本文将基于Android 4.4代码,为大家剖析一下Android的消息机制。

夜静水寒鱼不食 满船空载月明归 2760

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android:Handler消息机制(一)——什么是Handler消息机制

一、什么是Android的消息机制 Android的消息机制主要是指Handler的运行机制,handler是一套消息传递异步通信机制,Handler是Android的消息机制的上层接口,在开发过程中只需要和Handler交互即可,目的是将一个耗时任务切换到某个指定的线程中去执行。Handler的运行需要底层的MessageQueue和Lopper一起完成,这三者其实是一个整体。额外使用Mess...

ZytheMoon的博客 770

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android ACodec消息机制一

ACodec有一个BaseState和派生出来的其他State. FlushingState,ExecutingState等。     当有消息来的时候,如果派生类有重写,则会调到重写的方法里,如果没有,则会调到BaseState.     ACodec收到的消息分两种,一种是MediaCodec传过来的,一种是OMX Component传过来的。分别对应onMessageReceived和o

bencharluo的专栏 3508

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【转】聊一聊Android的消息机制

1 概述 在Android平台上,主要用到两种通信机制,即Binder机制和消息机制,前者用于跨进程通信,后者用于进程内部通信。 从技术实现上来说,消息机制还是比较简单的。从大的方面讲,不光是Android平台,各种平台的消息机制的原理基本上都是相近的,其中用到的主要概念大概有: 1)消息发送者; 2)消息队列; 3)消息处理循环。 示意图如下: 图中表达的基本意思是,消息发送者通过某种...

Jimmy's Blog 326

android底层消息机制,Android消息机制(一):概述设计架构

本系列文章将分N篇介绍Android中的消息机制。概述和设计架构Message和MessageQueueLooperHandlerHandler使用实战Handler引起的内存溢出ThreadLocalAndroid的应用程序和Windows应用程序一样,都是由消息驱动的。在Android操作系统中,谷歌也实现了消息循环处理机制。相关概念学习Android的消息机制,有几个设计概念我们必须了解:消...

weixin_32412379的博客 270

Android消息机制源码解析(一)——消息的载体Message

说到Android的消息机制,大家再熟悉不过了,几乎每个逻辑界面中都会涉及到,Activity的生命周期回调也是通过系统消息机制完成的,可见消息机制在Android中的重要性。在应用层,一般我们都是使用Handler来发送、处理消息,从工作线程切换到主线程来更新UI。往往开发者只跟Handler、Message打交道就能满足需求了,但它们背后的实现原理是怎样的呢?为了加深理解,深入学习Androi

Battling against our own ignorance 1388

10分钟掌握Android消息机制(一)机制分析

本文为个人学习笔记分享,没有任何商业化行为,对其他文章的引用都会标记。如有侵权行为,请及时提醒更正!如需转载请表明出处 本文主要来源是 任玉刚大神的《Android开发艺术探索》 提到消息机制大家应该都不陌生,从开发的角度来说,Handler是Android消息机制的上层接口,这使得再开发过程中只需要我们和Handler打交道就可以了。Handler的使用过程很简单,通过它可以轻松的将一个任...

刘沛Alsace的博客 246

Android的消息机制(一)

<br />转:http://jbg168.blog.163.com/blog/static/99683620107301828231/<br /> <br />android 有一种叫消息队列的说法,这里我们可以这样理解:假如一个隧道就是一个消息队列,那么里面的每一部汽车就是一个一个消息,这里我们先忽略掉超车等种种因素,只那么先进隧道的车将会先出,这个机制跟我们android 的消息机制是一样的。 一、 角色描述 1.Looper:(相当于隧道) 一个线程可以产生一个Looper对象,由它来管理

liluo1217的专栏 558

Android 消息机制Handler完全解析(一)

Handler是Android消息机制的上层接口,这使得在开发过程中只需要和Handler交互即可。Handler的使用过程很简单,通过它可以轻松地将一个任务切换到Handler所在的线程去执行。很多人认为Handler的作用是更新UI,这的确没错,但是更新UI仅仅是Handler的一个特殊使用场景。

乐于分享,乐于讨论,欢迎大家积极讨论 2444
上一篇: 设计模式学习(一)——六大原则
下一篇: Android消息机制二
<天各一方>
博客等级 码龄6年 17粉丝 17原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值