您的位置:首页 > 其它

读IntentService、HandlerThread源码之浅析

2017-04-21 13:34 435 查看
        通过阅读源码解决一下问题:

        1、IntentService基于HandlerThread与Handler实现?

        2、IntentService执行完任务之后,自己结束运行?

         首先看第一个问题:IntentService基于HandlerThread实现?看源码:

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

        IntentService的onCreate回调函数生成了一个HandlerThread线程(工作者线程)对象,紧接着调用了其start方法启动了该线程。同时获取Thread的Looper初始化ServiceHandler。到目前为止,所需的“材料”都准备好了,下面看看如何利用这些“材料”完成一次任务的处理。

        一般我们启动一个IntentService都会写如下的代码:

startService(new Intent(IntentServiceActivity.this, XXXXX.class));


        这样我们就启动了一个IntentService了。按照Service的生命周期,接下来会执行start回调函数:

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

        可以看到IntentService的处理方式是:发送消息给ServiceHandler,这样就将任务的执行切换到了工作线程。我们再看一下ServiceHandler是怎么处理的:

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


        有没有很熟悉的感觉?这就是onHandleIntent执行的地方,当任务执行完毕后,IntentService会调用stopSelf(...)来结束运行,无需开发者做额外的工作。

        以上分析已经验证了(1)(2)问题。

        最后,简单的说一下HandlerThread,这个HandlerThread是一个比较特殊的线程,是一个具有Looper的Thread,可以让开发者非常容易的从UI线程切换到工作线程。看一下源码吧:

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

        通过源码可以发现,HandlerThread的run方法在该线程中生成了一个Looper,而这个Looper在IntentService中初始化了IntentSerice的Handler。

附图一张:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: