我使用Service
独立运行startService()
活动。此服务处理来自活动的许多请求,然后创建Callable
,然后添加到ThreadPoolExecutor
。它看起来像这样:
private ExecutorService requestExecutor;
private CompletionService<Result> requestHandleService;
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
// Create new Request Task and submit
Callable<Result> request = new Callable<Result>(){
public Result call() throws Exception {
}
};
requestHandleService.submit(task);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy(){
super.onDestroy();
Log.d(TAg,"onDestroy service");
try{
if(requestExecutor!= null){
requestExecutor.shutdown();
}
}catch(Exception ex){
Ln.e(ex);
}finally{
requestExecutor= null;
requestHandleService= null;
}
}
问题在于我希望此服务独立运行并与活动并行。所以活动无法控制何时停止它。它应该只在所有任务完成后停止
我知道有a way等待ThreadPool完成,但这对我不起作用,因为我不需要保留列表请求。当此服务从活动接收请求时,它应创建新任务并立即在onStartCommand
中提交。
有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
你签出了IntentService
,这就是这种服务的作用。如果您需要多个线程,那么您可以包装您提交的任务,并检查ThreadPool使用的队列是否为空,如果是,则关闭服务和线程池。
Callable只是一个接口,所以只需从中进行回调。
@Override
public void onCreate() {
mHandler = new Handler();
}
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
// Create new Request Task and submit
Callable<Result> request = new Callable<Result>(){
public Result call() throws Exception {
Result result = // ... mRealTask.call();
mHandler.postDelayed(queueCheck, 300);
return result;
}
};
requestHandleService.submit(task);
return super.onStartCommand(intent, flags, startId);
}
Runnable queueCheck = new Runnable() {
public void run() {
if (requestExecutor.getQueue().isEmpty()) {
stopService(new Intent(this, getClass()));
mHandler.removeCallbacks(this);
}
}
};