使用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 创建一个异步的后台线程的更多相关文章

  1. Qt5中创建临时的后台线程。

    有个需求就是,GUI图形界面在上传文件到服务器的时候,需要用zip命令行打包,因为文件很多的时候,zip命令打包需要计算很长时间,所以把这样计算量大的任务分离到后台线程比较合适,然后任务完成,以信号槽 ...

  2. 【Python】使用cmd模块构造一个带有后台线程的交互命令行界面

    最近写一些测试工具,实在懒得搞GUI,然后意识到python有一个自带模块叫cmd,用了用发现简直是救星. 1. 基本用法 cmd模块很容易学到,基本的用法比较简单,继承模块下的Cmd类,添加需要的功 ...

  3. android 快速创建一个新的线程

    要给一个activity做成子线程的模式 第一种:直接创建子线程并启动 private Thread newThread; //声明一个子线程 new Thread() { @Override pub ...

  4. Java多线程——<五>后台线程(daemon)

    一.后台线程(守护线程) 学一个东西,最重要的一点就是,为什么要用它? 后台线程区别于普通线程,普通线程又可以称为用户线程,只完成用户自己想要完成的任务,不提供公共服务.而有时,我们希望编写一段程序, ...

  5. 后台线程(daemon)

    概念     所谓后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分.因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程. ...

  6. 后台线程,优先级,sleep,yield

    1.后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可获取的部分.当所有非后台线程结束时,程序也就 终止了,同时会杀死进程中所有后台线程.main()是一个非后 ...

  7. C#中创建线程,创建带参数的线程

    线程操作主要用到Thread类,他是定义在System.Threading.dll下.使用时需要添加这一个引用.该类提供给我们四个重载的构造函 构造函数定义: 无参数委托 [SecuritySafeC ...

  8. ExecutorService 建立一个多线程的线程池的步骤

    ExecutorService 建立一个多线程的线程池的步骤: 线程池的作用: 线程池功能是限制在系统中运行的线程数. 依据系统的环境情况,能够自己主动或手动设置线程数量.达到执行的最佳效果:少了浪费 ...

  9. Executors创建的4种线程池的使用

    Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...

随机推荐

  1. JDBC的连接和操作

    package Test; import java.sql.*; public class Test21 { public static void main(String[] args) { Conn ...

  2. 拒绝了对对象 'base_config' (数据库 '****',架构 'dbo')的 SELECT 权限

    在网上看了很多资料都是空说一谈,都只是说很简单,然后没有说遇到这样的情况具体该怎么做,看到这里都知道是权限问题,其实我们每一个人都知道,又是我觉得我还是要给以后遇到的朋友个解决方法:  这里用到的数据 ...

  3. 最近在新公司的一些HTML学习

    还是先把代码贴在这  后期再写感想 <!DOCTYPE html> <head> <meta http-equiv="x-ua-compatible" ...

  4. AJXA!让体验更美好

    AJXA = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服 ...

  5. Web打印组件jatoolsPrinter

    应用web化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于web的应用,客户端的规则很简单,容易学习,容易维护,容易发布.但对程序员来说,因为浏览器的局限性,却要面对很多挑战.怎么样 ...

  6. The Similarities and Differences Between C# and Java -- Part 1(译)

    原文地址 目录 介绍(Introduction) 相似点(Similarities) 编译单位(Compiled Units) 命名空间(Namespaces) 顶层成员(类型)(Top Level ...

  7. Module Zero安装

    返回<Module Zero学习目录> 使用模板创建(自动方式) 手动安装 核心(领域)层 基础设施层 展示层 这里需要抱歉的是,这里使用的博客园的Markdown语法,代码显示不是很好看 ...

  8. TODO:Ubuntu下安装Node

    TODO:Ubuntu下安装Node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高 ...

  9. 【Prince2是什么】PRINCE2认证之项目四大管理步骤

    昨天谈到PRINCE2要求项目经理在做项目的时候要考虑四大核心指标(成本.时间.质量.范围)加风险与收益这两个重要要素. 然后PRINCE2基于这几大要素进行了四大管理步骤,分别是: 1.计划 2.授 ...

  10. Atitit wsdl的原理attilax总结

    Atitit wsdl的原理attilax总结 1.1. 在 W3C 的 WSDL 发展史1 1.2. 获取wsdl,可能需要url后面加wsdl,也可能直接url1 1.3. Wsdl的作用2 1. ...