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;全面…

C++面试:hash算法基础

目录 基础概念 示例&#xff1a; 示例哈希函数 哈希规则 示例代码 面试中可能遇到的问题 解释哈希冲突及其解决方法 不同哈希算法的比较 MD5&#xff08;Message-Digest Algorithm 5&#xff09; SHA-1&#xff08;Secure Hash Algorithm 1&#xff09; SHA-256&…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM平台编程第六天-Linux下的boa(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1VUc8cGI7bTtXuGepZZY3Ng?pwd1688 提取码&#xff1a;1688 一、 1. www.boa.org下载boa-0.94.13.tar.gz 2. 解压 tar zxvf boa-0.94.13.tar.gz 3、cd src/ 4、./configure 5、 修改src/boa.c 注释掉下面语句: if (setuid(0) !…

什么是 React的refs?为什么它们很重要

Refs是React中的一个特殊属性&#xff0c;用于访问在组件中创建的DOM元素或组件实例。 Refs的重要性在于它们提供了一种直接访问DOM元素或组件实例的方式&#xff0c;使得我们可以在需要时操作它们。在某些情况下&#xff0c;例如在处理表单输入、媒体播放或触发动画等场景下&…

WPF自定义控件,聚合器模式传递消息

背景&#xff1a;自定义控件的消息传递和方法的调用可以使用聚合器来进行 定义聚合器&#xff1a; public class EventAggregator {public static ConcurrentDictionary<Type, List<Action<object>>> _handles new ConcurrentDictionary<Type, List<…

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 用于…

windows c++qt获取本机网卡信息

利用qt自带的QNetworkInterface接口以及cIphlpapi库&#xff0c;获取当前windows电脑下的网卡型号、物理地址、ip地址、子网掩码、网关等信息。 #include <QtNetwork/QNetworkInterface>#include <iostream> #include <Windows.h> #include <iphlpapi.h&…

腾讯云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分享腾讯云幻兽帕鲁…