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
转载于:https://www.cnblogs.com/popfisher/p/5634024.html
- HandlerThread 创建一个异步的后台线程
- HandlerThread 创建一个异步的后台线程
- 利用 HandlerThread 创建一个后台工作线程( AsyncTask 的缺点),处理图片缩放时内存溢出问题
- java多线程中校验一个后台线程中创建一个新线程,新线程是否是后台线程
- Java知识点整理:第十四章:java多线程编程、创建一个线程、异步与同步、java反射、类加载
- Android程序 类QQ通知常驻在Notification栏 点击Notification正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例
- ui线程和后台线程异步
- 如何创建一个类似 Instagram 的使用 Web Service 作后台的应用 part-1
- 用C#来创建一个后台进程
- Cocos2d-x 3.0 JNI BUG 修复。(Android 如何创建一个线程 延迟执行函数 创建一个随机数)
- android使用handlerthread创建线程示例
- 4、搭建一个后台服务器--服务端代码(异步,大并发)
- 如何在VC中利用系统函数创建一个新的线程
- 【学习笔记】JavaWeb 服务启动时,在后台启动加载一个线程
- 衔接UI线程和管理后台工作线程的类(多线程、异步调用)
- 创建一个线程的方法
- java线程创建方法只有两个?NO! 异步计算的结果如何拿到?
- 略谈如何创建一个监控线程
- JAVA 线程的概述、线程的创建、锁对象、死锁、线程的通讯、线程的生命周期、后台线程
- MFC创建一个线程