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

android Thread线程—HandlerThread

Android 消息机制就是 典型的「生产者-消费者」实现;而 HandlerThread 正是官方提供的“后台消费者线程”——内部自带 Looper/MessageQueue,让你只关心「生产消息」即可。下面把原理、用法和完整代码一次性给你。

HandlerThread 五步曲

// 1. 创建并启动
HandlerThread ht = new HandlerThread("bg-thread");
ht.start();// 2. 拿到 Looper 建 Handler(消费者)
Handler bgHandler = new Handler(ht.getLooper()) {@Override public void handleMessage(Message msg) {// 在后台线程执行耗时任务doHeavyWork(msg.obj);// 完成后可回调主线程uiHandler.obtainMessage(MSG_DONE, msg.obj).sendToTarget();}
};// 3. 任意线程生产消息
bgHandler.sendMessage(bgHandler.obtainMessage(0, data));// 4. 主线程更新 UI
Handler uiHandler = new Handler(Looper.getMainLooper()) {@Override public void handleMessage(Message msg) {updateUI(msg.obj);}
};// 5. 退出循环(Activity/Fragment 销毁时)
ht.quitSafely();

HandlerThread源码

public class HandlerThread extends Thread {/*** 线程真正开始执行时的入口。* 作用:为当前子线程创建 Looper,并让外部线程可以安全拿到这个 Looper。*/public void run() {mTid = Process.myTid();           // 记录当前线程的 Linux tid,方便调试Looper.prepare();                 // 1. 创建 Looper 并绑定到当前线程(ThreadLocal)synchronized (this) {             // 2. 同步块:防止并发获取 Looper 时出现竞态mLooper = Looper.myLooper();  // 3. 把刚建好的 Looper 保存到成员变量notifyAll();                  // 4. 唤醒所有在 getLooper() 中 wait() 的线程}Process.setThreadPriority(mPriority); // 5. 设置线程优先级(如 BACKGROUND)onLooperPrepared();                   // 6. 空方法,子类可重写做初始化工作Looper.loop();                        // 7. 开始无限循环:取消息 → 分发 → 处理mTid = -1;                            // 8. 循环退出后,清掉 tid 标记}/*** 供外部线程调用,获取与本线程关联的 Looper。* 如果线程尚未启动或 Looper 还没准备好,会阻塞等待。*/public Looper getLooper() {if (!isAlive()) {          // 线程根本没 start → 直接返回 nullreturn null;}boolean wasInterrupted = false;   // 记录等待过程中是否被中断// 线程已启动,但 Looper 可能还没创建好 → 需要等待synchronized (this) {while (isAlive() && mLooper == null) {try {wait();               // 等待 run() 里 notifyAll()} catch (InterruptedException e) {wasInterrupted = true; // 捕获中断,稍后恢复标志}}}// 如果在 wait() 时被中断,需要把中断状态“补”回去if (wasInterrupted) {Thread.currentThread().interrupt();}return mLooper;   // 此时 mLooper 一定非 null(除非线程已退出)}
}

http://www.xdnf.cn/news/1452727.html

相关文章:

  • 汽车v型推力杆总成三维5自由度性能及疲劳测试系统
  • 追觅科技举办2025「敢梦敢为」发布会,发布超30款全场景重磅新品
  • 【iOS】 懒加载
  • 每日工作计划管理工具:核心功能详解
  • 《Java餐厅的待客之道:BIO, NIO, AIO三种服务模式的进化》
  • UE5 制作游戏框架的部分经验积累(持续更新)
  • Mybatis入门、操作数据、配置xml映射、数据封装
  • 深入探讨AI三大领域的核心技术、实践方法以及未来发展趋势,结合具体代码示例、流程图和Prompt工程实践,全面展示AI编程的强大能力。
  • leetcode21.合并两个有序链表
  • 来自AI的背包系统
  • solar应急响应-7月
  • 怎样让外网计算机访问局域网计算机?通过公网地址访问不同内网服务的设置方法
  • Web 与 Nginx 网站服务介绍与nginx安装
  • 泛型-泛型方法
  • C++工程实战入门笔记10-面向对象之静态成员变量和成员函数、构造函数和析构函数
  • 【C++设计模式】第二篇:策略模式(Strategy)--从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
  • 联软科技:以“韧性安全”守护数字世界,致敬抗战胜利80周年的坚韧精神
  • vite与webpack对比
  • ATT层MTU大小
  • 【工具变量】数林指数数据集(2017-2024年)
  • 力扣654:最大二叉树
  • 51单片机-按键、蜂鸣器、定时器模块及中断
  • 大文件断点续传解决方案:基于Vue 2与Spring Boot的完整实现
  • C++并发编程-23. 线程间切分任务的方法
  • `void 0` 与 `undefined` 深度解析
  • mysql安装(压缩包方式8.0及以上)
  • 2026届IC秋招联芸科技IC面经(完整面试题)
  • 从零开始学大模型之大语言模型
  • 大模型部署全攻略:Docker+FastAPI+Nginx搭建高可用AI服务
  • MindMeister AI版:AI思维导图工具高效生成框架,解决结构卡壳与逻辑优化难题