Выполнены ли ваши задачи? Вы справляетесь с соответствующими исключениями? Сколько задач вы создаете?
Имейте в виду, что AsyncTask.THREAD_POOL_EXECUTOR
(по крайней мере, в API 17; этот документ страница имеет кучу полезных деталей), устанавливается с
public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
Где CORE_POOL_SIZE
находится 5 и MAXIMUM_POOL_SIZE
128.
SPoolWorkQueue с
private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10);
Это означает, что максимальная вместимость очереди составляет 10 единиц.
THREAD_POOL_EXECUTOR поддерживает не менее 5 потоков. По мере добавления заданий они добавляются в очередь. Когда очередь заполняется, тогда появятся новые потоки, до 128 (существуют другие ограничения tho).
Если это происходит (выполняется 128 потоков, максимальная скорость и очередь заполнена), то любые новые задачи будут отклонены и обработаны обработчиком по умолчанию (поскольку он явно не установлен, это AbortPolicy
), который бросает a RejectedExecutionException.
Убедитесь, что вы не просто ловите и не обрабатываете такие исключения.
Один из способов борьбы с этим - создать свой собственный ExecutorService (даже если это только ваш экземпляр ThreadPoolExecutor с разными параметрами) и настроить параметры, которые лучше всего соответствуют вашей ситуации. Параметры, такие как очередь (вы можете контролировать количество элементов, которые оно может удерживать, или, если оно неограничено, и т. Д.) Или как обрабатывать отклоненные задачи.
Почему бы вам не создать собственный пул? AsyncTask действительно не идеален для мелкозернистого управления. (См. Класс Executors.) Тем не менее, если у вас есть хорошие задачи и есть ссылки на них, вы можете просто отменить() задачи. – Delyan