我们都知道用IntentService 来处理异步操作非常高效方便,面试中我们也经常会遇到其相关问题,今天着重分析下其内部实现流程。
1、IntentService对比Service
a、
IntentService继承Service
b、处理异步操作,Service要通过开启Thread线程去处理,而IntentService内部实现了HandlerThread,而且会帮助其管理looper。c、当任务执行完后,IntentService 会自动停止,不需要我们去手动结束。
d、如果启动 IntentService 多次,那么每一个耗时操作会以工作队列的方式在 IntentService 的 onHandleIntent 回调方法中执行,依次去执行,使用串行的方式,执行完自动结束。
2、IntentService 内部实现
@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);
}
我们不难发现 ,其内部实现了HandlerThread,通过handler消息循环机制处理异步操作。
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);
}
}
执行完之后自行销毁。
3、使用场景
//异步处理
@Override
protected void onHandleIntent(Intent intent) {
Logout.e("onHandleIntent");
try {
Thread.sleep(1000);
isRunning = true;
count = 0;
while (isRunning) {
count++;
if (count >= 100) {
isRunning = false;
}
Thread.sleep(50);
sendThreadStatus("线程运行中...", count);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我们平时常用的场景应该是,我们在主线程开启服务,在IntentService 做异步处理,处理完数据通过EventBus通知主线程数据修改。

博客着重分析了IntentService的内部实现流程。对比了IntentService和Service,指出IntentService执行完任务会自动停止,多次启动时耗时操作会串行执行。介绍了其内部实现及自行销毁机制,还提及常用场景是在主线程开启服务,在IntentService做异步处理并通知主线程。
3万+

被折叠的 条评论
为什么被折叠?



