当前位置: 首页 > news >正文

Android之同一个Thread线程里只能有一个Looper?(ThreadLocal)

目录

  • ThreadLocal 的基本原理
  • Looper 和 ThreadLocal 的结合
    • 如何使用 ThreadLocal 的示例
      • 1. ThreadLocal 变量的定义
      • 2.创建 Looper 实例
      • 3. 获取 Looper 实例
  • 示例
    • 完整的示例
  • 总结

同一个Thread线程里只能有一个Looper对象。
在 Android 中,ThreadLocal 是一个非常有用的工具,它允许你在每个线程中存储和访问独立的变量副本。Looper 是 Android 的消息循环器,它在特定的线程中运行消息循环,并处理消息队列中的消息。ThreadLocal 和 Looper 的结合使得每个线程可以有一个独立的 Looper 实例。

ThreadLocal 的基本原理

ThreadLocal 提供了线程局部变量,确保每个线程都有自己的变量副本,而不会与其他线程的变量副本冲突。它的工作原理如下:

  • 每个线程都有一个 ThreadLocalMap,存储 ThreadLocal 变量。
  • 当线程访问 ThreadLocal 变量时,会从线程的 ThreadLocalMap 中获取对应的值。
  • 如果 ThreadLocal 变量在当前线程中不存在,则会创建一个新的变量副本,并存储在 ThreadLocalMap 中。

Looper 和 ThreadLocal 的结合

在 Android 中,Looper 使用 ThreadLocal 来确保每个线程只能有一个 Looper 实例。

如何使用 ThreadLocal 的示例

1. ThreadLocal 变量的定义

在 Looper 类中,有一个静态的 ThreadLocal 变量,用于存储每个线程的 Looper 实例。

private static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();

2.创建 Looper 实例

当你在一个线程中调用 Looper.prepare() 方法时,会创建一个新的 Looper 实例,并将其存储在 ThreadLocal 变量中。

public static void prepare() {if (sThreadLocal.get() != null) {throw new RuntimeException("Only one Looper may be created per thread");}sThreadLocal.set(new Looper());
}

在这个方法中,首先检查当前线程是否已经有一个 Looper 实例。如果有,则抛出异常,确保每个线程只能有一个 Looper 实例。如果没有,则创建一个新的 Looper 实例,并将其存储在 ThreadLocal 变量中。

3. 获取 Looper 实例

当你需要获取当前线程的 Looper 实例时,可以调用 Looper.myLooper() 方法。

public static @Nullable Looper myLooper() {return sThreadLocal.get();
}

这个方法从 ThreadLocal 变量中获取当前线程的 Looper 实例,并返回它。

示例

完整的示例

public class LooperExample {public static void main(String[] args) {// 创建一个新线程,并在其中创建 LooperThread thread = new Thread(new Runnable() {@Overridepublic void run() {// 准备 LooperLooper.prepare();// 获取当前线程的 LooperLooper looper = Looper.myLooper();System.out.println("Looper in thread: " + looper);// 开始消息循环Looper.loop();}});thread.start();// 主线程中尝试获取 LooperLooper mainLooper = Looper.myLooper();System.out.println("Looper in main thread: " + mainLooper);}
}

在示例中,创建了一个新线程,并在其中调用 Looper.prepare() 方法来创建一个 Looper 实例。然后,可以通过 Looper.myLooper() 方法获取当前线程的 Looper 实例。主线程中尝试获取 Looper 时,会返回 null,因为主线程中没有调用 Looper.prepare() 方法。

总结

通过使用 ThreadLocal,Looper 可以确保每个线程只能有一个 Looper 实例。这种机制不仅简化了 Looper 的管理,还确保了消息循环的正确性。每个线程都有自己的消息队列和消息循环,不会与其他线程的消息循环冲突。

Android 之 Handler
HandlerThread 和 Handler 区别
Android之Handler的post方法和sendMessage的区别
Android之Handler是如何保证延迟发送的

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 前端面试八股文
  • 部署Apache网站
  • 828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署GitLab服务器
  • 调度器怎么自己写?调度器在实现时需要注意哪些细节?请写一个jvm的调度器?如何在这个调度器中添加多个任务?
  • 【docker】基于docker-compose 安装elasticsearch + kibana + ik分词器(8.10.4版本)
  • ffmpeg面向对象-待定
  • 2024 第七届“巅峰极客”网络安全技能挑战赛初赛 Web方向 题解WirteUp
  • AWQ量化(Activation-aware Weight Quantization)
  • 本地运行 Qwen2-VL
  • 函数式编程思想
  • 第十一周:机器学习
  • 基于stm32f407的跟随行驶系统项目报告(利用openmv+超声波模块)
  • 项目实战 ---- 商用落地视频搜索系统(5)---service层核心
  • 自动化抢票 12306
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【知识碎片】第三方登录弹窗效果
  • Android系统模拟器绘制实现概述
  • CentOS 7 修改主机名
  • IP路由与转发
  • Java教程_软件开发基础
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • React+TypeScript入门
  • SpringBoot几种定时任务的实现方式
  • webpack入门学习手记(二)
  • windows下使用nginx调试简介
  • 排序(1):冒泡排序
  • 前端工程化(Gulp、Webpack)-webpack
  • 如何编写一个可升级的智能合约
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $.ajax()参数及用法
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (第61天)多租户架构(CDB/PDB)
  • (二)windows配置JDK环境
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (六)c52学习之旅-独立按键
  • (四)React组件、useState、组件样式
  • (五)关系数据库标准语言SQL
  • (转)linux 命令大全
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET和.COM和.CN域名区别
  • [ C++ ] STL_list 使用及其模拟实现
  • [2021 蓝帽杯] One Pointer PHP
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [android] 手机卫士黑名单功能(ListView优化)
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [BFS广搜]迷阵