HandlerThread源码分析与实战

HandlerThread是什么?
HandlerThread是一个Android封装好的线程类,里面封装了Looper,无需关心Looper的创建和循环

首先看一下HandlerThread的构造函数

public class HandlerThread extends Thread {
    int mPriority;
    int mTid = -1;
    Looper mLooper;

    public HandlerThread(String name) {
        super(name);
        mPriority = Process.THREAD_PRIORITY_DEFAULT;
    }

    public HandlerThread(String name, int priority) {
        super(name);
        mPriority = priority;

可以发现HandlerThread 继承Thread

看一下run函数源码

protected void onLooperPrepared() {
    }

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

可以看到run函数里有Looper.prepare和Looper.loop()循环不断从MessageQueue里取Message,这是子线程用handler必须实现的过程*(不懂的看一下上一篇 Android异步实现机制

synchronized (this) {
        mLooper = Looper.myLooper();
        notifyAll();
    }

这一端是为了异步线程Looper同步实现的操作

public Looper getLooper() {
   if (!isAlive()) {
       return null;
   }

   // If the thread has been started, wait until the looper has been created.
   synchronized (this) {
       while (isAlive() && mLooper == null) {
           try {
               wait();
           } catch (InterruptedException e) {
           }
       }
   }
   return mLooper;
}

notifyAll()和wait实现同步机制

结束当前线程的循环:quit()

public boolean quit() {
    Looper looper = getLooper();
     if (looper != null) {
         looper.quit();
         return true;
     }
     return false;
 }

所以在onDestory要调用一下quit()

=============================实战================================

HandlerThread handlerThread = new HandlerThread("my Thread") {
    @Override
    public void run() {
        super.run();

    }
};
handlerThread.start();
Handler mHandler = new Handler(handlerThread.getLooper()) {

    @Override
    public void handleMessage(Message msg) {
        //这是子线程
        switch (msg.what) {
            case 1:
                //TODO 执行耗时操作
                break;
            default:
                break;
        }
    }
};
mHandler.sendEmptyMessage(1);
handlerThread.quit();

总结:

1. HandlerThread是一个实现了Looper.prapare()和Looper.loop()的子线程。
2. HandlerThead解决了不断的new Thread()来创建子线程做耗时操作,可以优化性能
3. HandlerThread可以解决子线程和主线程交互,也可以解决子线程和子线程的交互
4. 不用的时候一定要调用quit()。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值