zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    k8s的包管理
    k8s的paas平台
    zookeeper相关
    java之rpc/orm
    java之spring
    EK算法
    SAM学习笔记
    生日悖论不是“悖论”!
    分块--莫队学习粗略预习
    二项式反演学习笔记
  • 原文地址:https://www.cnblogs.com/popfisher/p/5634024.html
Copyright © 2011-2022 走看看