Как решить RejectedExecutionException от AsyncTask? - PullRequest
0 голосов
/ 25 октября 2018

Я вызываю asyncTask из JobIntentService в следующем методе

 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 голосов
/ 25 октября 2018

Я звоню asyncTask из JobIntentService

Маловероятно, что это хороший план.

Частично, потому что ваш onHandleWork() метод уже в фоновом потоке.Вам не нужен второй.

Частично, потому что точка из AsyncTask предназначена для работы с основным потоком приложения после завершения фоновой работы.Нет никаких оснований для JobIntentService пытаться выполнить работу в главном потоке приложения.

Частично, это потому, что ваш процесс может быть остановлен, как только вернется onHandleWork(), убив вашу AsyncTasks.

Но появляется следующее исключение

Вы запустили 137 задач, которые еще не выполнены, и есть ограничение на количество ожидающих AsyncTasks вы можете запустить.

...