Handler详解

文章目录

    • 主线程和子线程
    • 消息机制
    • 作用
    • 原理
    • 内存泄露
    • HandlerThread
      • 含义
    • 线程池
    • 参考链接


主线程和子线程

从用途上来说Android的线程主要分为主线程和子线程两类,主线程主要处理和界面相关的工作,子线程主要处理耗时操作。除Thread之外,Android中还有其他扮演线程的角色如AsyncTask、IntentService、HandlerThread,其中AsyncTask的底层用到了线程池,IntentService和HandlerThread的底层直接使用了线程。

AsyncTask内部封装了线程池和Handler主要是为了方便开发者在在线程中更新UI;HandlerThread是一个具有消息循环的线程,它的内部可以使用Handler;IntentService是一个服务,系统对其进行了封装使其可以更方便的执行后台任务,IntentService内部采用HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出。IntentService是一个服务但是它不容易被系统杀死因此它可以尽量的保证任务的执行。

主线程是指进程所拥有的的线程,在Java中默认情况下一个进程只能有一个线程,这个线程就是主线程。主线程主要处理界面交互的相关逻辑,因为界面随时都有可能更新因此在主线程不能做耗时操作,否则界面就会出现卡顿的现象。主线程之外的线程都是子线程,也叫做工作线程。

Android沿用了Java的线程模型,也有主线程和子线程之分,主线程主要工作是运行四大组件及处理他们和用户的交互,子线程的主要工作就是处理耗时任务,例如网络请求,I/O操作等。Android3.0开始系统要求网络访问必须在子线程中进行否则就会报错,NetWorkOnMainThreadException。

消息机制

Android的消息机制就是 handler的运行机制

作用

1、调度计划执行的消息或任务
2、在子线程上进行任务排队

原理

在这里插入图片描述

Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列
Handler:可以发布或者处理一个消息或者操作一个Runnable,通过Handler发布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息
Looper:是Handler和消息队列之间通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的Handler,Handler接受到消息后调用handleMessage进行处理。
Message:消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理

常用方法

  • 发送消息
// 发送一个消息
mHandler.sendMessage(Message msg);// 发送一个延迟的消息标识
mHandler.sendEmptyMessageDelayed(int what, long delayMillis);
  • 处理消息
 @Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);NowPlayingActivity activity = mActivty.get();if (activity != null) {switch (msg.what) {case MSG_FAST_FORWARD:activity.fastForward();break;case MSG_BACK_FORWARD:activity.backForward();break;}}}
  • 发送一个runnable
mHandler.post(runnable);
  • 获取,移除消息等

内存泄露

handler使用不当会导致内存泄漏问题

handler内部类持有activity会导致内存泄漏,采用静态内部类并使用弱引用持有activity ,在退出的时候remove掉handler

 private static class MyHandler extends Handler {private final WeakReference<NowPlayingActivity> mActivty;private MyHandler(NowPlayingActivity mActivty) {//当前Activity的弱引用this.mActivty = new WeakReference(mActivty);}@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);NowPlayingActivity activity = mActivty.get();if (activity != null) {switch (msg.what) {case MSG_FAST_FORWARD:activity.fastForward();break;case MSG_BACK_FORWARD:activity.backForward();break;}}}}

HandlerThread

在这里插入图片描述

含义

HandlerThread是Thread的子类,自带一个looper,可以通过looper创建一个handler。HandlerThread是系统封装好的自带looper的线程,在子线程中无需在手动去调用Looper.prepare()和Looper.loop()这些方法。

可以封装一个HandlerThread的工具类

private static void init() {if (sThread == null|| sThread.isInterrupted()|| sThread.getState() == State.TERMINATED) {synchronized (MSGHandlerThread.class) {sThread = new MSGHandlerThread("MSG_HT_CC");sThread.start();sHandler = new Handler(sThread.getLooper());}}}

线程池

多线程并且调用频繁的场景建议使用线程池,线程池相关的介绍 JAVA线程池详解

参考链接

  1. handler机制详解
  2. 关于handler,看这篇就够了

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

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

相关文章

背完这些软件测试核心面试题,offer轻松拿捏了!

你赞同过 软件测试和开发 相关内容 01、您所熟悉的测试用例设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答&#xff1a;有黑盒和白盒两种测试种类&#xff0c;黑盒有等价类划分法&#xff0c;边界分析法&#xff0c;因果图法和…

研究生通用学术英语写作(刘美岩)教材电子版分享

研究生通用学术英语写作电子版资源分享 本着开源的思想&#xff0c;为了实现互通有无&#xff0c;诸位需要研究生通用学术英语写作电子版资源的朋友可以直接微信关注下面公众号&#xff0c;或者手动搜索莲花百货铺&#xff0c;在公众号中直接输入书名就可获得网盘链接&#xff…

数据结构-栈的讲解

栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底&#xff08;因为先进后出&#xff09;。栈中的数据元素遵守后进先出LIFO&#xff08;Last In Firs…

变现 5w+,一个被严重低估的 AI 蓝海赛道,居然用这个免费国产AI工具就能做!

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 文章首发于公众号&#xff1a;X小鹿AI副业 之前X小鹿一直在各…

中医揿针的注意事项

点击文末领取揿针的视频教程跟直播讲解 关于揿针的注意事项&#xff0c;我们可以从以下几个方面进行探讨&#xff1a; 01操作前准备 1. 确保针具的清洁和无菌状态&#xff0c;以避免感染。 2. 了解患者的身体状况&#xff0c;如是否有特殊疾病或过敏史&#xff0c;以便选择…

【C++】继承相关(基类与派生类的继承关系以及细节整理)

目录 00.引言 01.继承的定义 02.基类和派生类对象 03.继承中的作用域 04.派生类的默认成员函数 05.友元、静态成员 00.引言 继承是面向对象编程中的一个重要概念&#xff0c;它的作用是创建一个新的类&#xff0c;该类可以从一个已存在的类&#xff08;父类/基类&#x…

JavaWeb--13 tlias-web-management 黑马程序员 部门管理(修改部门信息)

tlias 1 需求分析和开发规范2 部门管理2.1 查询部门2.2 删除部门2.3 添加部门2.4 更新部门 1 需求分析和开发规范 需求说明–接口文档–思路分析–开发–测试–前后端联调 查看页面原型明确需求 根据页面原型和需求&#xff0c;进行表结构设计、编写接口文档(已提供) 阅读接口…

GT2712-STBD 三菱触摸屏12.1寸型

GT2712-STBD 三菱触摸屏12.1寸型 GT2712-STBD参数说明&#xff1a;12.1型, SVGA, TFT彩色液晶屏 65536色, 黑色边框, 电源DC24V。 一、三菱触摸屏GT2712-STBD性能规格&#xff1a; [显示部*1*2] . 显示软元件:TFT彩色液晶屏 . GT2712-STBD画面尺寸:12.1寸 . GT2712-STBD…

(项目)-KDE巡检报告(模板

金山云于12月26日对建行共计【30】个KDE集群,合计【198】台服务器进行了巡检服务。共发现系统风险【135】条,服务风险【1912】条,服务配置风险【368】条。 一、系统风险 1、风险分析(图片+描述) (1)磁盘使用率高 问题描述多个集群的多台服务器磁盘使用率较高,远超过…

2.数据类型与变量(java篇)

目录 数据类型与变量 数据类型 变量 整型变量 长整型变量 短整型变量 字节型变量 浮点型变量 双精度浮点型 单精度浮点型 字符型变量 布尔型变量&#xff08;boolean&#xff09; 类型转换 自动类型转换(隐式) 强制类型转换(显式) 类型提升 字符串类型 数据类…

Go实现树莓派控制舵机

公式说明 毫秒&#xff08;ms&#xff09;是时间的单位&#xff0c;赫兹&#xff08;Hz&#xff09;是频率的单位&#xff0c;而DutyMax通常是一个PWM&#xff08;脉冲宽度调制&#xff09;信号中表示最大占空比的值。以下是它们之间的关系和一些相关公式&#xff1a; 频率&…

从零开始学习Linux(6)----进程控制

1.环境变量 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c;我们在编写C/C代码时&#xff0c;链接时我们不知道我们链接的动态静态库在哪里&#xff0c;但可以连接成功&#xff0c;原因是环境变量帮助编译器进行查找&#xff0c;环境变量通常具有…