Android 线程切换(2): 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);
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值