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 ...
随机推荐
- JDBC的连接和操作
package Test; import java.sql.*; public class Test21 { public static void main(String[] args) { Conn ...
- 拒绝了对对象 'base_config' (数据库 '****',架构 'dbo')的 SELECT 权限
在网上看了很多资料都是空说一谈,都只是说很简单,然后没有说遇到这样的情况具体该怎么做,看到这里都知道是权限问题,其实我们每一个人都知道,又是我觉得我还是要给以后遇到的朋友个解决方法: 这里用到的数据 ...
- 最近在新公司的一些HTML学习
还是先把代码贴在这 后期再写感想 <!DOCTYPE html> <head> <meta http-equiv="x-ua-compatible" ...
- AJXA!让体验更美好
AJXA = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服 ...
- Web打印组件jatoolsPrinter
应用web化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于web的应用,客户端的规则很简单,容易学习,容易维护,容易发布.但对程序员来说,因为浏览器的局限性,却要面对很多挑战.怎么样 ...
- The Similarities and Differences Between C# and Java -- Part 1(译)
原文地址 目录 介绍(Introduction) 相似点(Similarities) 编译单位(Compiled Units) 命名空间(Namespaces) 顶层成员(类型)(Top Level ...
- Module Zero安装
返回<Module Zero学习目录> 使用模板创建(自动方式) 手动安装 核心(领域)层 基础设施层 展示层 这里需要抱歉的是,这里使用的博客园的Markdown语法,代码显示不是很好看 ...
- TODO:Ubuntu下安装Node
TODO:Ubuntu下安装Node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高 ...
- 【Prince2是什么】PRINCE2认证之项目四大管理步骤
昨天谈到PRINCE2要求项目经理在做项目的时候要考虑四大核心指标(成本.时间.质量.范围)加风险与收益这两个重要要素. 然后PRINCE2基于这几大要素进行了四大管理步骤,分别是: 1.计划 2.授 ...
- Atitit wsdl的原理attilax总结
Atitit wsdl的原理attilax总结 1.1. 在 W3C 的 WSDL 发展史1 1.2. 获取wsdl,可能需要url后面加wsdl,也可能直接url1 1.3. Wsdl的作用2 1. ...