Android 基础技术——Handler

笔者希望做一个系列,整理 Android 基础技术,本章是关于 Handler
为什么一个线程对应一个Looper?

核心:通过ThreadLocal保证

Looper.prepare的时候,ThreadLocal.get如果不空报异常;否则调用ThreadLocal.set, ThreadLocal.set 会调用当前线程Thread里的ThreadLocalmap  put 键值对,put 的键值对就是 Key = ThreadLocal, Value = Looper

线程里有TreadLocalMap的成员变量  Key = ThreadLocal,  Value = Looper   

Looper 中有一个 static final 的成员变量就是 ThreadLocal,意味着唯一性

 Looper有final的成员MessageQueue

一个线程可以有多少个 Handler?

可以有多个

Handler内存泄漏的原因

匿名内部类handler 默认持有外部类的activity的引用。

并且Handler.enqueMessage的时候, msg.target = handler, message持有了handler,

引用链:msg->handler->activity或者fragment

为什么主线程可以New handler; 子线程new handler需要做什么

子线程 必须 Looper.prepare + Looper.loop

主线程   在ActivityThread.main方法里  帮你Looper.prepareMainLoop和Looper.loop

子线程中维护的looper,消息队列无消息的时候处理方案是什么?有什么作用?

主线程会阻塞,主线程不能调用quit

子线程没有消息的时候,需要调用quit 

这个quit作用:唤醒线程;

调用 quit 后,messagequeue返回null 退出loop

消息的睡眠的唤醒机制是怎样的?

生产者消费者模式

入队满的时候  阻塞    这个handler没有限制满的情况

出队空的时候 阻塞

java的多线程里有阻塞队列,但是handler不是这样,没有限制消息个数

nativePollOnce 到了C++层 会调用epoll_wait等待, 阻塞整个线程, CPU释放

nativeWake 到了C++层调用 epoll 的wake

多个handler往messagequeue发送消息 如何保证线程安全

通过两点来保证线程安全:

一个线程只有一个messageQueue

使用synchronized, 内置锁,加锁和释放是JVM帮我们完成的,锁的是MessageQueue 对象里面的所有函数/代码块都受限

子线程发送消息,为什么能在主线程接收,也就是线程是如何切换的

子线程thread: handler.sendMessage->MessageQueue.enqueMessage.

MessageQueue是没有线程之说。他是一个数据结构,内存共享

主线程loop   轮询MessageQueue。这个时候MessageQueue.next在主线程执行。

 ThreadLocal整个系统只有一个吗? 会不会有矛盾

线程1-ThreadLocalMap1  唯一的ThreadLocal-looper1

线程2-ThreadLocalMap2  唯一的ThreadLocal-looper2

一个线程对应一个Looper,一个Looper 对应一个 ThreadLocal

调整系统时间对延时消息有没影响

Handler的延迟消息计算是通过SystemClock类来计算,跟系统时间没有任何关系,这是根据Handler自启动以来非睡眠正常运行时间的毫秒数和代码指定的postDelayed的时间来计算的。

我们使用Message如何创建?

通过obtainMessage

享元设计模式: 内存复用,android中使用非常广泛  如recyclerView

维持一个消息池,防止内存碎片->内存抖动->OOM

消息释放后,插入到队列头部,重置队头为这个消息节点

Looper死循环为什么不会导致卡死

和anr无关。

为什么msg 阻塞不会导致anr?  

这个阻塞是指线程没有事情做了,释放cpu,休眠

什么是同步屏障?

msg.target=null 的消息就是同步屏障

同步屏障的场景:刷新UI    ViewRootImpl   scheduleTraversals---> postSyncBarrier 在对头插入节点

同步屏障的删除:ViewRootImpl   unScheduleTraversals---->removeSyncBarrier  删除屏障的节点

同步屏障:就是把同步消息给屏障掉了!! 然后优先执行异步消息(setAsynchrious标志)

messageQueue.next的时候  

先判断 如果msg.target==null  轮询消息队列,直到找到一个异步消息为止,执行这个异步消息。

setAsynchrious(true)这个标志。

刷新UI 使用了同步屏障就是为了保证及时执行消息,如果保证不了16ms 刷新一次, 会导致掉帧。

我们平时发送到消息是同步消息

同步屏障的作用是什么??

我们向主线程发送了一个UI绘制操作Message,而此时消息队列中的消息非常多,那么这个Message的处理可能会得到延迟,绘制不及时造成界面卡顿。同步屏障机制的作用,是让这个绘制消息得以越过其他的消息,优先被执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cesium渲染白膜数据

async DrawBaiMoFun2() {// tiles 矩阵变换let changePostion = (tileSet, tx, ty, tz, rx, ry, rz, scale, center) => {if (!center) return;const m = Cesium.Transforms.eastNorthUpToFixedFrame(center);const surface =center ||Cesium.Cartesian3.fromRadians(cartog…

自动驾驶代客泊车AVP决策规划详细设计

背景 随着产品的不断迭代,外部停车场的铺开,PAVP车辆需要应对的场景将越来越复杂,因此整体算法泛化能力的提升显得尤为关键。为了打磨巡航规划的能力,算法架构应当设计的更为灵活,可以针对使用场景迁入更为先进有效的算…

【Linux】分区向左扩容的方法

文章目录 为什么是向左扩容操作前的备份方法:启动盘试用Ubuntu后进行操作 为什么是向左扩容 Linux向右扩容非常简单,无论是系统自带的disks工具还是apt安装的gparted工具,都有图像化的界面可以操作。但是,都不支持向左扩容。笔者…

01 Redis的特性+下载安装启动+Redis自动启动+客户端连接

1.1 NoSQL NoSQL(“non-relational”, “Not Only SQL”),泛指非关系型的数据库。 键值存储数据库 : 就像 Map 一样的 key-value 对。如Redis文档数据库 : NoSQL 与关系型数据的结合,最像关系…

免费电视TV盒子软件,好用的免费电视盒子软件大全,免费电视盒子APP大全,2024最新整理

1、TVbox下载地址、影视接口、配置教程 下载地址 TVbox TVbox可用接口地址合集 注:接口均来源于互联网收集分享!所有接口都是经过测试的,如果出现加载失败等情况,可能是因为接口针对的盒子有兼容问题,可以多试试几…

Linux中查看端口被哪个进程占用、进程调用的配置文件、目录等

1.查看被占用的端口的进程,netstat/ss -antulp | grep :端口号 2.通过上面的命令就可以列出,这个端口被哪些应用程序所占用,然后找到对应的进程PID https://img-blog.csdnimg.cn/c375eb2bed754426b373907acaa7346e.png 3.根据PID查询进程。…

isctf---web

圣杯战争 php反序列 ?payloadO:6:"summon":2:{s:5:"Saber";O:8:"artifact":2:{s:10:"excalibuer";O:7:"prepare":1:{s:7:"release";O:5:"saber":1:{s:6:"weapon";s:52:"php://filter…

Ubuntu系统中部署C++环境与Visual Studio Code软件

本文介绍在Linux Ubuntu操作系统下,配置Visual Studio Code软件与C++代码开发环境的方法。 在文章VMware虚拟机部署Linux Ubuntu系统的方法中,我们介绍了Linux Ubuntu操作系统的下载、安装方法;本文则基于前述基础,继续介绍在Linux Ubuntu操作系统中配置Visual Studio Code…

【GitHub项目推荐--游戏模拟器(switch)】【转载】

01 任天堂模拟器 yuzu 是 GitHub 上斩获 Star 最多的开源 Nintendo Switch 模拟器 ,使用 C 编写,考虑到了可移植性,该模拟器包括 Windows 和 Linux 端。 如果你的 PC 满足必要的硬件要求,该模拟器就能够运行大多数商业游戏&…

Django实战

一、开发登录表单 def login_form(request):html = <html><body><form method="post">用户名:<input name = "username" type="text"></input></br>密码:<input name = "password" type = &q…

CSS 之 图片九宫格变幻效果

一、简介 ​ 本篇博客用于讲解如何实现图片九宫格变幻的样式效果&#xff0c;将图片分为九块填充在33的的九宫格子元素中&#xff0c;并结合grid、hover、transition等CSS属性&#xff0c;实现元素hover时&#xff0c;九宫格子元素合并为一张完整图片的动画效果。 ​ 为了简化…

SpringMVC 环境搭建入门

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架&#xff0c;属于SpringFrameWork 的后续产品&#xff0c;已经融合在 Spring Web Flow 中。 SpringMVC 已经成为目前最主流的MVC框架之一&#xff0c;并且随着Spring3.0 的发布&#xff0c;全面…

02 Redis之配置文件

3. Redis配置文件 3.1 网络部分 首先明确&#xff0c;tcp-backlogestablished Linux 内核 2.2 版本之后&#xff08;现在大部分都是3.x了&#xff09; TCP 系统中维护了两个队列, 用来存放TCP连接 a. SYN_RECEIVED 队列中存放未完成三次握手的连接 b. ESTABLISHED队列中存放已…

Java面试题之序列化和反序列化

Java面试题之序列化和反序列化 文章目录 Java面试题之序列化和反序列化序列化和反序列化什么是序列化?什么是反序列化?如果有些字段不想进行序列化怎么办&#xff1f;常见序列化协议有哪些&#xff1f;为什么不推荐使用 JDK 自带的序列化&#xff1f; 文章来自Java Guide 用于…

腾讯云4核16G服务器价格,用于幻兽帕鲁Palworld专用

腾讯云幻兽帕鲁服务器4核16G、8核32G和16核64G配置可选&#xff0c;4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64G35M配置580元年1个月、1740元3个月、6960元一年&#xff0c;腾讯云百科txybk.com分享腾讯云幻兽帕鲁…

腾讯云幻兽帕鲁专有服务器配置价格表,4核16G、8核32G

幻兽帕鲁服务器配置CPU内存多大合适&#xff1f;如何选择&#xff1f;最低4核8G起步&#xff0c;4核16G是官方推荐配置&#xff0c;最好是4核32G配置。阿腾云atengyun.com分享幻兽帕鲁Palworld服务器CPU内存配置及租用费用&#xff0c;如下图&#xff0c;Palworld官方推荐服务器…

特征点匹配 harris

算法的核心是利用局部窗口在图像上进行移动&#xff0c;判断灰度是否发生较大的变化。如果窗口内的灰度值&#xff08;在梯度图上&#xff09;都有较大的变化&#xff0c;那么这个窗口所在区域就存在角点。 这样就可以将 Harris 角点检测算法分为以下三步&#xff1a; 当窗口…

【Java面试】Mysql

目录 sql的执行顺序索引的优点和缺点怎么避免索引失效(也属于sql优化的一种)一条sql查询非常慢&#xff0c;我们怎么去排查和优化&#xff1f;存储引擎 MylSAM和InnoDB、Memory的区别事务的四大特性(ACID)脏读、不可重复读、幻读事务的隔离级别&#xff1f;怎么优化数据库SQL优…

云计算中的弹性是什么?

云弹性是指当客户需求增加或减少时&#xff0c;自动从数据中心配置和取消配置资源。这使得云资源(包括计算、存储和内存资源)能够根据需求变化快速重新分配。CPU/处理、内存、输入/输出带宽和存储容量等计算资源可以根据需要增加或减少&#xff0c;而不会影响系统性能。 它旨在…

应急消防应用步入“繁花”时代,卓翼智能消防无人机顺势而行大有可为

近日&#xff0c;北京卓翼智能科技有限公司&#xff08;以下简称“卓翼智能”&#xff09;宣布完成超亿元B轮融资&#xff0c;融资金额高达2.5亿元。这个“智能无人系统”黑马品牌&#xff0c;凭什么出圈&#xff1f;重点发力在哪些领域呢&#xff1f;今天&#xff0c;带你走进…