[Android 源码分析] HandlerThread

HandlerThread是Android开发中经常用到的类,是一个带looper的thread,用户可以很方便的通过handler通知HandlerThread进行耗时的工作。

一、典型使用场景

我们经常像下面这样使用:

HandlerThread handlerThread = new HandlerThread("testThread");
handlerThread.start();

Looper looper = handlerThread.getLooper();
// MyHandler是自定义的Handler子类
MyHandler myHandler = new MyHandler(looper);

使用HandlerThreadLooper创建Handler,这样,MyHandlerhandleMessage方法会在handlerThread中执行,达到耗时操作在子线程中处理的目的。

二、构造函数

HandlerThread继承自Thread

public class HandlerThread extends Thread

有两个构造函数,第一个设置线程优先级为默认优先级,第二个可以按照需要设定。

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

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

三、主要代码部分

HandlerThreadstart方法调用后,执行了下面的代码。

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

它的主要工作是创建了Looper

mLooper = Looper.myLooper();

调用了onLooperPrepared做一些用户希望的初始化工作,用户通过重载该接口实现。

/**
* Call back method that can be explicitly overridden if needed to execute some
* setup before Looper loops.
*/
protected void onLooperPrepared() {
}

我们注意到,run方法中使用了synchronized进行同步,

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

再看下getLooper()方法就明白了

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;
}

因为run方法是异步执行的,getLooper方法调用的时候,looper可能还没有创建好。只要mLooper == null,就会一直wait,直到被唤醒后发现mLooper!=null,然后返回Looper

最后Looper.loop()进行消息循环,线程阻塞,接受消息,处理消息。

四、HandlerThread结束

结束的代码很简单,就是退出消息循环,结束线程执行。

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

public boolean quitSafely() {
    Looper looper = getLooper();
    if (looper != null) {
        looper.quitSafely();
        return true;
   }
   return false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值