HandlerThread总结

Posted Alex_MaHao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HandlerThread总结相关的知识,希望对你有一定的参考价值。

概述

android中,如果子线程想主线程发消息,可以通过handler。而主线程想往子线程发消息,需要子线程调用Loop.prepare() & Loop.loop()。这是由于handler的使用依赖Loop,而在主线程中,默认已经进行了Loop的初始化工作,并保存到了主线程里,子线程并没有。

有一种简单的方式,便是通过HandlerThread,他内部维护了一个消息队列,并在子线程运行,能够便捷的完成异步任务。

具体使用


 // 步骤1:创建HandlerThread实例对象
        // 传入参数 = 线程名字,作用 = 标记该线程
        HandlerThread mHandlerThread = new HandlerThread("handlerThread");

        // 步骤2:启动线程
        // 此时mHandler中维护了一个消息队列,对应任务依次执行。参考主线程handler逻辑
        mHandlerThread.start();

        // 步骤3:创建工作线程Handler 注意参数,一定要绑定对应的消息队列
        Handler workHandler = new Handler(mHandlerThread.getLooper();

        // 步骤4:执行异步任务
        workHandler.post(new Runnable() 
            @Override
            public void run() 
                // 该方法会在子线程执行
            
        );

        // 步骤5:结束线程,即停止线程的消息循环
        mHandlerThread.quit();

原理分析

实质:HandlerThread创建维护了一个子线程,并在初始化时启动当前子线程的Looper对象。

public class HandlerThread extends Thread 

启动时

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

注意

HandlerThread构造的消息队列,是单线程的。即同时post()多次,会按照调用顺序依次执行

以上是关于HandlerThread总结的主要内容,如果未能解决你的问题,请参考以下文章

Handler,Looper,HandlerThread浅析

HandlerThread解析

HandlerThread使用及源码分析

HandlerThread 与 IntentService

从HandlerThread 的使用来分析HandlerThread的源码

从HandlerThread 的使用来分析HandlerThread的源码