HandlerThread 创建一个异步的后台线程
使用HandlerThread几大优点:
1、制作一个后台异步线程,需要的时候就可以丢一个任务给它,使用比较灵活;
2、Android系统提供的,使用简单方便,内部自己封装了Looper+Handler机制;
3、可以代替Thread + Looper + Handler的写法;
4、可以避免项目中随处可见的 new Thread().start(),增加系统开销;
使用HandlerThread注意:
1、不要执行太耗时(一般情况不要超过100ms级别的)的任务,如果太耗时可能会阻塞其他的任务,使得其他任务迟迟得不到执行的结果
2、要自己控制好合适的生命周期,启动和结束都要自己控制
使用HandlerThread封装一个一定生命周期内的后台线程
使用场景:
有一个相对比较大的功能,主界面是一个Activity,在这个Activity内有很多的交互,不同的界面可能会加载不同是数据
源码封装:
源码中使用HandlerThread的Handler的post的方式,没有使用Handler的sendMessage(message)的方式,使用post的方式比较简单,代码少,其实post内部也是调用了sendMessage的方式的
/**
* 需要自己控制生命周期,在这个生命周期内都可以使用这个线程
*
*/
public class BackgroundThread extends HandlerThread {
private static BackgroundThread mInstance;
private static Handler mHandler; public BackgroundThread() {
super("ThreadName", android.os.Process.THREAD_PRIORITY_DEFAULT);
} public static void prepareThread() {
if (mInstance == null) {
mInstance = new BackgroundThread();
// 创建HandlerThread后一定要记得start()
mInstance.start();
// 获取HandlerThread的Looper,创建Handler,通过Looper初始化
mHandler = new Handler(mInstance.getLooper());
}
} /**
* 如果需要在后台线程做一件事情,那么直接调用post方法,使用非常方便
*/
public static void post(final Runnable runnable) {
mHandler.post(runnable);
} public static void postDelayed(final Runnable runnable, long nDelay) {
mHandler.postDelayed(runnable, nDelay);
} /**
* 退出HandlerThread
*/
public static void destroyThread() {
if (mInstance != null) {
mInstance.quit();
mInstance = null;
mHandler = null;
}
}
}
BackgroundThread使用案例:
1、在Activity的onCreate中执行HandlerThread初始化和启动操作
BackgroundThread.prepareThread();
2、在Activity的onDestroy中执行HandlerThread的销毁操作
BackgroundThread.destroyThread();
3、在BackgroudThread的生命周期内,任何地方都可以调用post或者postDelayed方法给线程丢一个任务
BackgroundThread.post(new Runnable() {
@Override
public void run() {
// 执行耗时操作(这里就是同步操作)
// 执行完成得到结果
// 对结果进行处理,如果需要操作UI,得使用主线程的Handler抛到主线程执行(或者其他的方式)
}
});
扩展阅读:
HandlerThread之Handler的sendMessage方法:


HandlerThread的Handler的post方法源码内部调用:


Android HandlerThread 完全解析
http://blog.csdn.net/lmj623565791/article/details/47079737/
Android Thread Looper Handler 关系
http://blog.csdn.net/elfylin/article/details/6085042
HandlerThread 创建一个异步的后台线程的更多相关文章
- Qt5中创建临时的后台线程。
有个需求就是,GUI图形界面在上传文件到服务器的时候,需要用zip命令行打包,因为文件很多的时候,zip命令打包需要计算很长时间,所以把这样计算量大的任务分离到后台线程比较合适,然后任务完成,以信号槽 ...
- 【Python】使用cmd模块构造一个带有后台线程的交互命令行界面
最近写一些测试工具,实在懒得搞GUI,然后意识到python有一个自带模块叫cmd,用了用发现简直是救星. 1. 基本用法 cmd模块很容易学到,基本的用法比较简单,继承模块下的Cmd类,添加需要的功 ...
- android 快速创建一个新的线程
要给一个activity做成子线程的模式 第一种:直接创建子线程并启动 private Thread newThread; //声明一个子线程 new Thread() { @Override pub ...
- Java多线程——<五>后台线程(daemon)
一.后台线程(守护线程) 学一个东西,最重要的一点就是,为什么要用它? 后台线程区别于普通线程,普通线程又可以称为用户线程,只完成用户自己想要完成的任务,不提供公共服务.而有时,我们希望编写一段程序, ...
- 后台线程(daemon)
概念 所谓后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分.因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程. ...
- 后台线程,优先级,sleep,yield
1.后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可获取的部分.当所有非后台线程结束时,程序也就 终止了,同时会杀死进程中所有后台线程.main()是一个非后 ...
- C#中创建线程,创建带参数的线程
线程操作主要用到Thread类,他是定义在System.Threading.dll下.使用时需要添加这一个引用.该类提供给我们四个重载的构造函 构造函数定义: 无参数委托 [SecuritySafeC ...
- ExecutorService 建立一个多线程的线程池的步骤
ExecutorService 建立一个多线程的线程池的步骤: 线程池的作用: 线程池功能是限制在系统中运行的线程数. 依据系统的环境情况,能够自己主动或手动设置线程数量.达到执行的最佳效果:少了浪费 ...
- Executors创建的4种线程池的使用
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...
随机推荐
- 一鼓作气 博客--第二篇 note2
1.循环正常结束是指没有中间截断,即没有执行break; for i in range(10) print(i) else: print("循环正常结束") 2.嵌套循环 for ...
- The Solution of UESTC 2016 Summer Training #1 Div.2 Problem B
Link http://acm.hust.edu.cn/vjudge/contest/121539#problem/B Description standard input/output Althou ...
- LA
grmon -altjtag -u 公式rand()%(b-a),是求范围随机数的计算公式,%是做求余运算,正整数对n求余的范围肯定是在0~n-1之间,也就是rand()%(b-a)的范围是0~b-a ...
- SCRIPT65535: 意外地调用了方法或属性访问 ie下不兼容 解决
一般有一下几种 $("#id").text("xxx") 改成 $("#id").attr("text"," ...
- ABP理论学习之导航(Navigation)
返回总目录 本篇目录 创建菜单 注册导航提供者 展示菜单 每一个web应用在页面之间都有一些要导航的菜单.ABP提供了公用的基础设施来创建菜单并将菜单展示给用户. 创建菜单 一个应用可能由不同的模块组 ...
- python自动化测试(3)- 自动化框架及工具
python自动化测试(3) 自动化框架及工具 1 概述 手续的关于测试的方法论,都是建立在之前的文章里面提到的观点: 功能测试不建议做自动化 接口测试性价比最高 接口测试可以做自动化 后面所谈到 ...
- WCF basicHttpBinding之Message Security Mode
原创地址:http://www.cnblogs.com/jfzhu/p/4067873.html 转载请注明出处 前面的文章<WCF Security基本概念>介绍了WCF的securit ...
- HTTPS那些事(二)SSL证书(转载)
原创地址:http://www.guokr.com/post/116169/ 从第一部分HTTP工作原理中,我们可以了解到HTTPS核心的一个部分是数据传输之前的握手,握手过程中确定了数据加密的密 ...
- 【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读
本文主要介绍如何使用微软TTS语音引擎实现文本朗读,以及生成wav格式的声音文件. 1.语音引擎及语音库的安装 TTS(Text-To-Speech)是指文本语音的简称,即通过TTS引擎把文本转化为语 ...
- maven package 知识(转载)
“打包“这个词听起来比较土,比较正式的说法应该是”构建项目软件包“,具体说就是将项目中的各种文件,比如源代码.编译生成的字节码.配置文件.文档,按照规范的格式生成归档,最常见的当然就是JAR包和WAR ...