美文网首页
第九章 HandlerThread

第九章 HandlerThread

作者: 唔笛plk | 来源:发表于2018-12-24 13:45 被阅读0次

    一、HandlerThread是什么

    HandlerThread继承自Thread,它本质上就是一个Thread,而且专门用来处理Handler的消息

    二、HandlerThread的使用方法

    1.两种创建HandlerThread实例对象方法

      HandlerThread handlerThread=new HandlerThread("TAG");
     // 设置优先级
     // HandlerThread handlerThread1=new HandlerThread("TAG",Process.THREAD_PRIORITY_DEFAULT);
    

    一个参数是name,指的是线程的名称,另一个参数是priority,指的是线程优先级。线程的优先级的取值范围为-20到19。优先级高的获得的CPU资源更多,反之则越少。-20代表优先级最高,19最低。我们可以根据自己的需要去设置线程的优先级,也可以采用默认的优先级,HandlerThread的默认优先级是Process.THREAD_PRIORITY_DEFAULT,具体值为0

     handlerThread.run();
    

    3.通过Handler构建循环消息处理机制

     Handler handler=new Handler(handlerThread.getLooper(), new Handler.Callback() {
                @Override
                public boolean handleMessage(Message msg) {
                    // TODO 处理子线程任务
                    return false;
                }
            });
    handler.sendEmptyMessage(1);
    

    这里要注意,在创建Handler作为HandlerThread线程消息执行者的时候必须先调用run()方法,因为创建Handler所需要的Looper参数是从HandlerThread中获得的,而Looper对象的赋值又是在HandlerThread的run()方法中创建。

    三、HandlerThread机制原理

     @Override
        public void run() {
            mTid = Process.myTid();
            Looper.prepare();
            synchronized (this) {
                mLooper = Looper.myLooper();
                notifyAll();
            }
            Process.setThreadPriority(mPriority);
            onLooperPrepared();
            Looper.loop();
            mTid = -1;
        }
    

    四、HandlerThread应用场景

    HandlerThread比较适用于单线程+异步队列的场景,比如IO读写操作数据库、文件等,耗时不多而且也不会产生较大的阻塞。对于网络IO操作,HandlerThread并不适合,因为它只有一个线程,还得排队一个一个等着。
    这里单线程+异步队列模型的使用场景还举几个例子:

    • 应用刚启动时的数据初始化操作,如果开启多个线程同时执行,有可能争夺UI线程的CPU执行时间,造成卡顿,而使用该模型,通过设置优先级就可以将同步工作顺序的执行,而又不影响UI的初始化;
    • 从数据库中读取数据展现在ListView中,通过Handler的postAtFrontOfQueue方法,快速将读取操作加入队列前端执行,必要时返回给主线程更新UI;
    • HandlerThread应用在IntentService中,IntentService是一个需要长时间执行任务Service,优先级要比线程高。

    相关文章

      网友评论

          本文标题:第九章 HandlerThread

          本文链接:https://www.haomeiwen.com/subject/nvzakqtx.html