如何解决AsyncTask的RejectedExecutionException?

时间:2018-10-25 11:24:28

标签: android service android-asynctask jobintentservice

我正在通过以下方法从JobIntentService调用asyncTask

 public static void search(final String searchTerm, ApiCallback<SearchResult<Item>> apiCallback) {
        new SimpleTask<>(new SimpleTask.TaskAction<SearchResult<Item>>() {
            @Override
            public SearchResult<Item> doTask() {
                return new SearchResult<>(
                        searchTerm,
                        ArrayUtils.INSTANCE.concat(
                                SearchController.getSearch(Controller.DRUG, searchTerm)                    
                );
            }
        }, apiCallback).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }

但是要遵循以下例外条件

 Caused by java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@fbb2c9 rejected from java.util.concurrent.ThreadPoolExecutor@c1a8dce[Running, pool size = 9, active threads = 9, queued tasks = 128, completed tasks = 22]
           at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2078)
           at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:843)
           at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1389)
           at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:651)

1 个答案:

答案 0 :(得分:2)

  

我正在从JobIntentService调用asyncTask

这不太可能是个好计划。

部分是因为您的onHandleWork()方法已经在后台线程上已经了。您不需要第二个。

部分是因为AsyncTask point 是在后台工作完成后在主应用程序线程上进行工作。 JobIntentService没有理由尝试在主应用程序线程上进行工作。

部分原因是,onHandleWork()返回后,您的进程可能会停止,从而杀死AsyncTasks

  

但是要遵循以下例外条件

您已经启动了137个尚未完成的任务,并且可以启动的未决AsyncTasks数量是有限制的。