网站首页 > 技术文章 正文
使用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
 
- 最近发表
 - 
- 聊一下 gRPC 的 C++ 异步编程_grpc 异步流模式
 - [原创首发]安全日志管理中心实战(3)——开源NIDS之suricata部署
 - 超详细手把手搭建在ubuntu系统的FFmpeg环境
 - Nginx运维之路(Docker多段构建新版本并增加第三方模
 - 92.1K小星星,一款开源免费的远程桌面,让你告别付费远程控制!
 - Go 人脸识别教程_piwigo人脸识别
 - 安卓手机安装Termux——搭建移动服务器
 - ubuntu 安装开发环境(c/c++ 15)_ubuntu安装c++编译器
 - Rust开发环境搭建指南:从安装到镜像配置的零坑实践
 - Windows系统安装VirtualBox构造本地Linux开发环境
 
 
- 标签列表
 - 
- cmd/c (90)
 - c++中::是什么意思 (84)
 - 标签用于 (71)
 - 主键只能有一个吗 (77)
 - c#console.writeline不显示 (95)
 - pythoncase语句 (88)
 - es6includes (74)
 - sqlset (76)
 - apt-getinstall-y (100)
 - node_modules怎么生成 (87)
 - chromepost (71)
 - flexdirection (73)
 - c++int转char (80)
 - mysqlany_value (79)
 - static函数和普通函数 (84)
 - el-date-picker开始日期早于结束日期 (76)
 - js判断是否是json字符串 (75)
 - c语言min函数头文件 (77)
 - asynccallback (87)
 - localstorage.removeitem (77)
 - vector线程安全吗 (73)
 - java (73)
 - js数组插入 (83)
 - mac安装java (72)
 - 无效的列索引 (74)
 
 
