Looper分析

Looper分析

在 Handler 机制中,Looper 的作用是提供了一个消息循环 ( message loop ) 的机制,用于处理和分发消息。

Looper 是一个线程局部的对象,每个线程只能有一个 Looper 对象。它通过一个无限循环来不断地从消息队列中取出消息,并将消息分发给对应的 Handler 进行处理。

在使用 Handler 机制时,我们可以通过调用 Looper.prepare() 方法来创建一个Looper对象,并通过 Looper.loop() 方法来启动消息循环。在消息循环开始后,Looper会不断地从消息队列中取出消息,然后将消息分发给对应的 Handler 进行处理。

Handler 可以通过调用 post()sendMessage() 等方法将消息发送到消息队列中,然后由 Looper 负责将这些消息取出并分发给对应的 Handler 进行处理。这样就实现了线程间的消息传递和处理。

Looper还可以通过调用 quit() 方法来终止消息循环,停止消息的处理。

下来以主线程内的 Looper 分析下。

Looper 创建/运行

App 运行,进程创建后主线程开始运行的入口在 ActivityThreadmain(String[] args) 方法。

// ActivityThread.java  sdk30public static void main(String[] args) {// ...... 一系列的初始化操作。// 创建主线程的 Looper 并设置到 ThreadLocal,同时创建了绑定的 MessageQueue。Looper.prepareMainLooper(); // ......ActivityThread thread = new ActivityThread(); // 主线程对象创建thread.attach(false, startSeq);if (sMainThreadHandler == null) { // 主线程处理各事件的 HandlersMainThreadHandler = thread.getHandler();}// ......Looper.loop();  // Looper 开始无限循环,从 MessageQueue 中取消息,也同时保证了主线程的存活。throw new RuntimeException("Main thread loop unexpectedly exited");
}

上面代码中 Looper 的创建与运行就两行。

  1. Looper.prepareMainLooper(); 方法的调用,创建了 **主线程 ** 的 Looper 对象,并将它设置到了 sThreadLocal 中。

    // Looper.java sdk30private static void prepare(boolean quitAllowed) {if (sThreadLocal.get() != null) {throw new RuntimeException("Only one Looper may be created per thread");}sThreadLocal.set(new Looper(quitAllowed));
    }@Deprecated
    public static void prepareMainLooper() {prepare(false);synchronized (Looper.class) {if (sMainLooper != null) {throw new IllegalStateException("The main Looper has already been prepared.");}sMainLooper = myLooper();}
    }
    

    上面代码保证了一个线程只能有一个 Looper 对象:

    • if (sThreadLocal.get() != null) 判断表明 sThreadLocal 内对应于主线程的 Looper 对象只能存在一个。若主线程运行起来时发现已经有存在的 Looper 对象,将抛出异常,也就表明 app 进程直接crash。
    • prepareMainLooper() 被标注了 @DeprecatedLooperpublic 类,在 app 程序中是可以调用 Looper.prepareMainLooper() 方法的。换言之,在 sThreadLocal 中已经存在 Looper 对象的情况下,,可以再次调用方法 Looper.prepareMainLooper(),因此在 prepare(boolean quitAllowed) 一开始就先判断是否存在了 Looper 对象。进一步表明,一个线程中只能有一个 Looper
    • 赋值 sMainLooper

    这样主线程的 Looper 就创建完成了。

  2. Looper.loop(); 开启了 Looper 的无限循环,从 MessageQueue 中取消息,附带同时保证了主线程的存活。还负责将 msg 分发给对应的 Handler 执行。

在这里插入图片描述

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

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

相关文章

Linux搭建文件服务器

搭建简单文件服务器 基于centos7.9搭建http文件服务器基于centos7.9搭建nginx文件服务器基于ubuntu2204搭建http文件服务器 IP环境192.168.200.100VMware17 基于centos7.9搭建http文件服务器 安装httpd [rootlocalhost ~]# yum install -y httpd关闭防火墙以及selinux [roo…

【软考-中级】系统集成项目管理工程师 【15 信息 (文档) 和配置管理】

持续更新。。。。。。。。。。。。。。。 【第十五章】信息(文档)和配置管理 知识精讲考点 1:软件文档一般分为三类:开发文档、产品文档、管理文档。考点 2:文档的质量可以分为四级:考点 3:配置管考点 4:考点 5:考点6:考点 7:配置项版本号:考点 8:考点9…

36张图详解网络基础知识

下午好,我的网工朋友。 在网工这行,只要是面试,一般都难逃网络协议相关的问题吧。 不管是OSI还是TCP/IP,这都是非常重要、基础的知识,很多知识点都是以它们为基础去串联的。 作为网络世界的底层技术,掌握…

Docker安装ES7.14和Kibana7.14(无账号密码)

一、Docker安装ES7.14.0 1、下载镜像 docker pull elasticsearch:7.14.0 2、docker安装7.14.0 mkdir -p /usr/local/elasticsearch/config mkdir -p /usr/local/elasticsearch/data chmod 777 -R /usr/local/elasticsearch/ echo "http.host: 0.0.0.0" >> /u…

Java 多线程案例

文章目录 1. 多线程案例1.1 单例模式1.2 阻塞式队列 2. 定时器3. 线程池 1. 多线程案例 1.1 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目标是确保一个类只有一个实例,并提供一个全局访问点。…

关于网络协议的若干问题(五)

1、DH 算法会因为传输随机数被破解吗? 答:DH 算法的交换材料要分公钥部分和私钥部分,公钥部分和其他非对称加密一样,都是可以传输的,所以对于安全性是没有影响的,而且传输材料远比传输原始的公钥更加安全。…

Apache Jmeter测压工具快速入门

Jmeter测压工具快速入门 一、Jmeter介绍二、Jmeter On Mac2.1 下载2.2 安装2.2.1 环境配置2.2.2 初始化设置 2.3 测试2.3.1 创建JDBC Connection Configuration2.3.2 创建线程组2.3.3 创建JDBC Request2.3.4 创建结果监控2.3.5 运行结果 2.4 问题记录2.4.1 VM option UseG1GC异…

小程序技术在信创操作系统中的应用趋势:适配能力有哪些?

小程序技术在信创操作系统中的应用前景非常广阔,但也面临着一些挑战和问题。开发者需要积极应对这些挑战和问题,为信创操作系统的发展和推广做出贡献。同时,开发者也需要关注小程序技术在信创操作系统中的应用趋势,积极探索新的应…

视频剪辑SDK,实现高效的移动端视频编辑

为了满足企业对视频编辑的需求,美摄提供了iOS/Android端视频编辑SDK技术开发服务,帮助企业快速高效地制作高质量视频。本文将详细介绍美摄的视频编辑SDK的优势和特点,以及如何为企业提供技术解决方案。 随着智能手机的普及和移动互联网的发展…

Java实现业务异步的几种方案

背景: 在java中异步线程很重要,比如在业务流处理时,需要通知硬件设备,发短信通知用户,或者需要上传一些图片资源到其他服务器这种耗时的操作,在主线程里处理会阻塞整理流程,而且我们也不需要等…

Zookeeper集群 + Kafka集群的详细介绍与部署

文章目录 1. Zookeeper 概述1.1 简介1.2 Zookeeper的工作机制1.3 Zookeeper 主要特点1.4 Zookeeper 数据结构1.5 Zookeeper的相关应用场景1.5.1 统一命名服务1.5.2 统一配置管理1.5.3 统一集群管理1.5.4 服务器动态上下线1.5.5 软负载均衡 1.6 Zookeeper 选举机制1.6.1 第一次启…

Jmeter 之接口测试(http 接口测试)

基础知识储备 一、了解 jmeter 接口测试请求接口的原理 客户端 -- 发送一个请求动作 -- 服务器响应 -- 返回客户端 客户端 -- 发送一个请求动作 --jmeter 代理服务器 --- 服务器 --jmeter 代理服务器 -- 服务器 二、了解基础接口知识: 1、什么是接口&#xff1a…

uniapp 小程序优惠劵样式

先看效果图 上代码 <view class"coupon"><view class"tickets" v-for"(item,index) in 10" :key"item"><view class"l-tickets"><view class"name">10元优惠劵</view><view cl…

centos7 部署oracle完整教程(命令行)

centos7 部署oracle完整教程&#xff08;命令行&#xff09; 一. centos7安装oracle1.查看Swap分区空间&#xff08;不能小于2G&#xff09;2.修改CentOS系统标识 (由于Oracle默认不支持CentOS)2.1.删除CentOS Linux release 7.9.2009 (Core)&#xff08;快捷键dd&#xff09;&…

python爬取boss直聘数据(selenium+xpath)

文章目录 一、主要目标二、开发环境三、selenium安装和驱动下载四、主要思路五、代码展示和说明1、导入相关库2、启动浏览器3、搜索框定位创建csv文件招聘页面数据解析(XPATH)总代码效果展示 六、总结 一、主要目标 以boss直聘为目标网站&#xff0c;主要目的是爬取下图中的所…

EV SSL数字证书贵吗

EVSSL证书通常适用于具有高需求的网站和企业&#xff0c;特别是涉及在线交易、金融服务、电子商务平台等需要建立用户信任的场景。大型企业、金融机构、电子商务平台等可以受益于使用EV证书来提升品牌形象和安全性。 申请EVSSL证书&#xff08;Extended Validation SSL certifi…

Ubuntu:VS Code IDE安装ESP-IDF【保姆级】(草稿)

物联网开发学习笔记——目录索引 Visual Studio Code&#xff08;简称“VS Code”&#xff09;是Microsoft向开发者们提供的一款真正的跨平台编辑器。 参考&#xff1a; VS Code官网&#xff1a;Visual Studio Code - Code Editing. Redefined 乐鑫官网&#xff1a;ESP-IDF …

python:talib.BBANDS 画股价-布林线图

python 安装使用 TA_lib 安装主要在 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 这个网站找到 TA_Lib-0.4.24-cp310-cp310-win_amd64.whl pip install /pypi/TA_Lib-0.4.24-cp310-cp310-win_amd64.whl 编写 talib_boll.py 如下 # -*- coding: utf-8 -*- import os impor…

c语言练习93:环形链表的约瑟夫问题

环形链表的约瑟夫问题 环形链表的约瑟夫问题_牛客题霸_牛客网 描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是…

使用IDEA2022.1创建Maven工程出现卡死问题

使用IDEA创建Maven工程出现卡死问题&#xff0c;这个是一个bug 这里是别人和官方提供这个bug,大家可以参考一下 话不多说&#xff0c;上教程 解决方案&#xff1a; 方案1&#xff1a;更新idea版本 方案2&#xff1a;关闭工程&#xff0c;再新建&#xff0c;看图