当前位置: 代码迷 >> 综合 >> Android 线程切换(2): HandlerThread 和IntentService
  详细解决方案

Android 线程切换(2): HandlerThread 和IntentService

热度:12   发布时间:2023-12-12 20:16:56.0

文章目录

    • HandlerThread
    • IntentService

HandlerThread

HandlerThread继承了Thread,它是一种可以使用Handler的Thread,它的实现也简单,就是在 run() 方法中通过 Looper.prepare() 来初始化消息队列与 Looper.loop() 来开启消息循环。然后我们可以通过HandlerThread#getLooper获取HandlerThread创建的线程的Looper,并创建持有这个Looper的Handler,然后就可以使用这个Handler发送信息来达到在子线程执行任务的目的。
HandlerThread的run方法实现如下:

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

onLooperPrepared() 是一个空方法,我们可以覆盖这个方法来监听HandlerThread初始化完成的信息,而Looper.loop是一个无限循环的方法,所以run()正常情况下会永远运行。因此当我们不需要使用HandlerThread的时候,要调用它的quit或者quitSafely方法来停止Looper,以终止线程的运行,避免内存泄漏。

IntentService

IntentService是一种特殊的Service,它是一个继承了Service的抽象类。IntentService用于执行后台耗时的操作,当任务执行完成后它会自动停止,同时由于IntentService是服务的原因,这导致它的优先级比单纯的线程要高,不容易被杀死,所以IntentService比较适合用来执行一些高优先级的后台任务。
在实现上,IntentService封装了HandlerThread和Handler,在onCreate方法中初始化了一个HandlerThread并创建相应Looper的Handler;而在onStartCommand方法中处理每个后台任务。IntentService的onCreate和onStartCommand方法的实现如下:

@Override
public void onCreate() {
    super.onCreate();HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");thread.start();mServiceLooper = thread.getLooper();mServiceHandler = new ServiceHandler(mServiceLooper);
}@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
    onStart(intent, startId);return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}@Override
public void onStart(@Nullable Intent intent, int startId) {
    Message msg = mServiceHandler.obtainMessage();msg.arg1 = startId;msg.obj = intent;mServiceHandler.sendMessage(msg);
}private final class ServiceHandler extends Handler {
    public ServiceHandler(Looper looper) {
    super(looper);}@Overridepublic void handleMessage(Message msg) {
    onHandleIntent((Intent)msg.obj);stopSelf(msg.arg1);}
}

onCreate和onStartCommand就如前面所说,一个初始化执行环境,一个执行任务,具体执行任务的方法在ServiceHandler 的handleMessageonHandleIntentIntentService的抽象方法,以IntentService收到的Intent为参数,由调用者实现。当onHandleIntent执行完,任务完成后,随即IntentService便调用了stopSelf结束Service,并在onDestroy方法中调用Looper的quit方法结束结束子线程。

  相关解决方案