网站首页 > 技术文章 正文
使用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抛到主线程执行(或者其他的方式) } });
猜你喜欢
- 2024-12-19 Jetpack 组件库 | 用代码解析 Lifecycles 库,让代码更容易维护
- 2024-12-19 一文带你搞懂Android多线程Handler
- 2024-12-19 告诉你为什么视频广告点不了关闭 视频老是广告怎么办
- 2024-12-19 作为Android开发者你还不会Compose吗
- 2024-12-19 抖音Android无障碍开发知识总结 android开发无障碍指南pdf
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)