文章目录
-
- 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 的handleMessage,onHandleIntent即IntentService的抽象方法,以IntentService收到的Intent为参数,由调用者实现。当onHandleIntent执行完,任务完成后,随即IntentService便调用了stopSelf结束Service,并在onDestroy方法中调用Looper的quit方法结束结束子线程。