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 完全解析

Android Thread Looper Handler 关系

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

C#线程篇---解答线程之惑(2)

我们都知道,在这个行业,追求的就是用最少的时间学最多的知识,这是我写这个系列最想达到的目标,在最快的时间内,帮助更多的人学习更多的线程知识。 前一篇,...

3216
来自专栏刘望舒

Android App 优化之ANR详解

ANR全名Application Not Responding, 也就是"应用无响应". 当操作在一段时间内系统无法处理时, 系统层面会弹出上图那样的ANR对话...

791
来自专栏向治洪

android 开发Handler源码剖析

Android的消息机制主要是Handler的运行机制,而讲Handler的机制,又需要和MessageQueue和Looper结合。MessageQueue中...

1707
来自专栏Android干货园

Android中线程的使用

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/47...

601
来自专栏yang0range

Android 当子线程执行完,提交到主线程工具类

252
来自专栏技术小黑屋

详解 Android 中的 HandlerThread

HandlerThread是Android API提供的一个便捷的类,使用它我们可以快速的创建一个带有Looper的线程,有了Looper这个线程,我们又可以生...

795
来自专栏项勇

笔记37 | Android App优化之ANR详解

2066
来自专栏架构说

gdb调试多线程 如何解死锁问题

基础_多线程 Q1 gdb调试多线程 如何解死锁问题? A1 说明:排版不是很好可以直接查看原文链接 gdb基本用法 info threads(show al...

33210
来自专栏非典型技术宅

Swift多线程:使用Thread进行多线程间通讯,协调子线程任务1. Thread的三种建立方式2. Thread的基本使用3. 使用NSCondition实现线程间通讯4. pthread

922
来自专栏Linux驱动

10.按键之互斥、阻塞机制(详解)

本节目标: 学习原子操作和互斥信号量,实现互斥机制,同一时刻只能一个应用程序使用驱动程序 学习阻塞和非阻塞操作 当设备被一个程序打开时,存在被另一个程序打开的可...

2356

扫码关注云+社区