ThreadPoolExcutor完成时Android停止服务

时间:2013-12-27 19:03:07

标签: android android-service threadpoolexecutor

我使用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中提交。
有什么方法可以解决这个问题吗?

1 个答案:

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