Я использую многие классы AsyncTask в своем приложении. Я всегда начинаю их использовать:Android - как проверить, достиг ли ThreadPoolExecutor предел очереди?
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
asyncTask.execute();
}
Недавно я получил исключение RejectedExecutionException. Я читал об этом и понимаю, почему это происходит (превышение максимального количества задач, которые может иметь исполнитель потока пулов в очереди).
Но я не читал нигде о том, как проверить, имеет ли исполняемый файл пула потоков доступные слоты, чтобы я мог избежать этого. Из того, что я тестировал asyncTask.execute(); метод не имеет этого ограничения.
Так что я искал что-то вроде этого:
if(executorCanHandlerAnotherQueue()){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
asyncTask.execute();
}
}
else{
asyncTask.execute();
}
Любые идеи о том, как осуществить это с обратной совместимостью до API 9?
Благодарю вас за ваш ответ, но это был не вопрос. Я все это знаю. То, что я ищу, - это метод типа boolean canExecutorAddAnotherQueue(), который я могу использовать, чтобы определить, могу ли я добавить asyncTask в пул потоков Executor – Anonymous
. См. Мой обновленный ответ, вы можете использовать try catch или write пользовательский обработчик для вашего дела. – Ken
Метод, который вы написали, больше похож на него. попробуйте поймать, кажется, плохой подход ...Но я не использую пользовательский ThreadPoolExecutor. AsyncTask использует его собственный. поэтому MAX_QUEUE_SIZE_YOU_DEFINED - это тот, который определяет AsyncTask. Что из того, что я понимаю, зависит от количества ядер, которые имеют устройства. Проверяя это на моем устройстве, я увидел, что исключение выбрано, когда getQueueSize() - 128, но я не знаю, как получить этот номер с помощью API. – Anonymous