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的处理可能会得到延迟,绘制不及时造成界面卡顿。同步屏障机制的作用,是让这个绘制消息得以越过其他的消息,优先被执行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2、趋势Trend (copy)

利用移动平均数和时间虚拟模型对长期变化进行建模。 文章目录 1、什么是趋势?2、移动平均图3、工程趋势4、示例 - 隧道交通1、什么是趋势? 时间序列的趋势组成部分代表了序列均值的持久、长期变化。趋势是序列中变化最慢的部分,代表了最重要的大时间尺度。在产品销售的时间…

Unity中使用Ultraleap的Slider组件

Unity中使用Ultraleap的Slider组件,实现物体在指定范围内滑动: 本节在上一节基础上进行,上一小结参考如下: Unity中使用Ultraleap的InteractionButton组件 本节工程文件如下: Unity中使用Ultraleap的Slider组件 1、在…

【Algorithms 4】算法(第4版)学习笔记 02 - 1.4 算法分析

文章目录 前言参考目录学习笔记1:科学方法2:观察举例:三数之和3:近似4:增长数量级4.1:二分查找 demo4.2:二分查找代码实现4.3:二分查找比较次数的证明(比较次数最多为lgN…

MYSQL的配置和安装

下载安装 打开官网 MYSQL官网 点击DOWNLOADS 滑到最低下点击:MYSQL Community(GPL) Downlads 点击Download Archives 点击MySQL Community Server进入网站 选择相应版本下载,这里选择的是5.7.24版本,x86 64位【按需选择】 下载解压 配置文件…

H5022B降压恒流芯片 内置MOS PWM调光 高性价比 支持48V 60V 80V 100V

内置MOSFET的100V降压恒流芯片是一种能够将高输入电压降低到稳定的输出电流的降压稳流器。以下是其基本工作原理: 输入电压检测:芯片首先检测输入电压,即来自电源的100V。这涉及使用电压检测电路,以确保输入电压在可接受范围内。…

springboot 怎么设置局域网访问

如何配置Spring Boot应用以实现局域网访问 在开发一个Spring Boot应用时,我们通常会通过localhost来访问和测试我们的应用。但是,当我们想要在局域网中分享我们的应用,供其他设备访问时,仅仅使用localhost是不够的。本文将引导你…

PyNest 一个可以搭建微服务的 Python 包

PyNest 在构建 Python API 和微服务方面崭露头角,解决了 FastAPI 中存在的关键问题,因此成为卓越的框架。凭借其模块化的架构和先进的特性,PyNest 在 2024 年及以后有望成为 Python 开发者的首选选择。 随着 Python 生态系统的不断成熟&…

关于信号处理中的测量精度与频谱细化问题及其仿真实践

说明 频谱细化问题其实很早之前就想研究并整理一下了,车载雷达中我们似乎对这个话题并不太涉及(最多只是在测角时用补0 FFT的方法),想要了解这个话题的源头是很早之前的一次面试时面试官问我:有哪些提高测量精度的方法?并进而引申…

Linux 文件IO

目录 linux下的文件分类: 文件描述符原理:(底层原理,可跳过) 虚拟文件系统: 内存中的inode与磁盘中的inode open函数 函数原型: 形参列表: 代码: close函数 er…

eNSP学习——华为交换机STP配置和选路规则

目录 原理概述 实验内容 实验目的 实验步骤 实验拓扑 实验步骤 基本配置 配置网络中的根交换机 理解根端口的选举 理解指定端口的选举(首先比较根路径开销) 原理概述 生成树协议(英语:Spanning Tree Protocol&#…

excel 选中指定区域

问题 excel 选中指定区域 详细问题 笔者有一个excel数据集,数据量较大,如何快速选中指定区域 解决方案 步骤1、 点击起始单元格 确定单元格坐标(建议直接CtrlC复制至剪贴板) 具体操作入下图所示 步骤2、 点击结束单元格 …

微信小程序|推箱子小游戏

推箱子游戏是一种经典的益智游戏,通过移动箱子将其推到指定位置,完成关卡的过程。随着小程序的发展,越来越多的人开始在手机上玩推箱子游戏。本文将介绍如何利用小程序实现推箱子游戏,并分享一些技术实现的方法。 目录 引言游戏背景介绍游戏规则及挑战技术实现步骤创建游戏…

Leetcode—1570. 两个稀疏向量的点积【中等】Plus

2024每日刷题&#xff08;一零四&#xff09; Leetcode—1570. 两个稀疏向量的点积 实现代码 class SparseVector { public:SparseVector(vector<int> &nums) {for(int i 0; i < nums.size(); i) {if(nums[i]) {indexNum[i] nums[i];}}}// Return the dotProd…

3 款最好的电脑硬盘数据迁移软件

您将从本页了解 3 款最好的 SSD硬盘数据迁移软件&#xff0c;磁盘供应商提供的软件和可靠的第三方软件。仔细阅读本文并做出您的选择。 什么是数据迁移&#xff1f; 数据迁移是将数据移动到其他计算机或存储设备的过程。在日常工作活动中&#xff0c;常见的数据迁移有三种&…

类Markdown实时绘图编辑器mermaid-live-editor

什么是 Mermaid &#xff1f; Mermaid 是一个基于文本的图表描述语言&#xff0c;它允许你使用简洁的语法来描述各种不同类型的图表和图示&#xff0c;例如流程图、时序图、甘特图等。 什么是 mermaid-live-editor &#xff1f; mermaid-live-editor 是一个基于 Javascript 的在…

springboot3-web开发

跟着尚硅谷学springboot3 0.配置application语法 表示复杂对象person Component ConfigurationProperties(prefix "person") public class Person {private String name;private Integer age;private Date birthday;private Child chlid;private List<Dog>…

实战Vue.js与MySQL:爱心商城项目开发指南

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

14.4.2 Flash读取与修改数据库中的数据

14.4.2 Flash读取与修改数据库中的数据 计数器是网站必不可少的统计工具&#xff0c;使用计数器可以使网站管理者对网站的访问情况有一个清晰的了解。如果仅仅是统计首页访问量的话&#xff0c;用文本文件来存储数据就可以了&#xff0c;但如果统计的数据量比较大的话(如文章系…

The Sandbox 专访|印尼国家足球队主教练申台龙

Q. 请简单介绍一下自己。 我是申台龙&#xff01;我目前担任印度尼西亚国家足球队主教练。我在印尼负责三支国家队的教练工作&#xff0c;分别是 A 组&#xff08;成年队&#xff09;、U-23 和 U-20。在韩国&#xff0c;我的名字是申台龙&#xff08;Shin Tae-yong&#xff09;…

【React】前端项目引入阿里图标

【React】前端项目引入阿里图标 方式11、登录自己的iconfont-阿里巴巴矢量图标库&#xff0c;把需要的图标加入到自己的项目中去&#xff1b;2、加入并进入到项目中去选择Font class 并下载到本地3、得到的文件夹如下4. 把红框中的部分粘贴到自己的项目中&#xff08;public 文…