Android线程工具(下)

236 阅读2分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。

HandlerThread

HandlerThread是一种可以使用Handler的Thread,这从其名字就可看出,类似于ActivityThread,对于一个Thread我们主要看它的run方法,如下

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

在这里我们看到了熟悉的代码,Looper.prepare()和Looper.loop(),这在之前关于一般线程的消息传递机制这一节中提到过。
那么外界如何拿到HandlerThread的Handler呢?HandlerThread的结构如下

image.png

getThreadHandler如下

@NonNull
public Handler getThreadHandler() {
    if (mHandler == null) {
        mHandler = new Handler(getLooper());
    }
    return mHandler;
}

由此外界只要通过HandlerThread的getThreadHandler方法就可以拿到Handler了

IntentService

之前我们介绍的都是在一个普通的Thread中跑任务,但是这有一个非常大的缺陷,就是如果用户的内存不够,那么普通Thread很容易就被杀死,因此为了提高任务的优先级,引入了IntentService,作为Service,android的四大组件之一,其优先级显著提高。
既然是Service,那么从Service的生命周期的开始(不管是bind,还是start )onCreate来看起

@Override
public void onCreate() {
    // TODO: It would be nice to have an option to hold a partial wakelock
    // during processing, and to have a static startService(Context, Intent)
    // method that would launch the service & hand off a wakelock.

    super.onCreate();
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    thread.start();

    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);
}

从onCreate方法可以看出IntentService包括两个主要成员,一个mServiceHandler,一个HandlerThread 下面我们从startService这个启动方式去看这个流程,startService后,会调用onStartCommand方法,接着会调用onStart,onStart如下

@Override
public void onStart(@Nullable Intent intent, int startId) {
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    mServiceHandler.sendMessage(msg);
}

sendMessage后会传给mServiceHandler的handleMessage方法来处理

@Override
public void handleMessage(Message msg) {
    onHandleIntent((Intent)msg.obj);
    stopSelf(msg.arg1);
}

也就是交给了onHandleIntent,这个方法是我们继承IntentService这个抽象类后要重写的方法,我们可以在这个方法中处理具体的后台任务