У меня есть цикл for, который создает несколько AsyncTasks. Существует большой массив из data
, и цикл for обрабатывает все данные и вызывает исполнитель с этими данными. AsyncTask выполняет некоторую интенсивную обработку этих данных, и этот код отлично работает для небольших наборов данных, т. Е. Массив данных достаточно мал, чтобы создать не слишком много потоков.Контролируемое выполнение AsyncTaks
for(Data datum: data)
{
new SomeAsyncDataTask(datum, this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
Однако, так бывает, что данные массивно и работает это на производстве, т.е. на реальном устройстве Android падает приложение из-за слишком много нитей с RejectedExecutionException. Кроме того, существует форма пользовательского интерфейса, с помощью которого пользователь может передавать данные и вручную вызывать тот же класс SomeAsyncDataTask AsyncTask
.
Я ищу решение, с помощью которого я могу контролировать это выполнение, ограничивая 5 AsyncTasks для запуска одновременно, и любые дополнительные задачи должны быть поставлены в очередь. Кроме того, когда пользователь отправляет задание, если в очереди есть какая-то работа без очереди, я бы предпочел поставить эту задачу пользователя наверху, чтобы при завершении выполняемой задачи эта задача получила возможность запускать, а остальные задачи выполнялись только позже. Googling показывает мне некоторые результаты; как будто что-то называлось PriorityBlockingQueue, но просмотр кода меня смутил. Это решение? Если да, то как использовать его в этом сценарии (для кода выше). Пожалуйста, предложите решение - спасибо!
Используйте ExecutorService как fixedThreadPool с 5 потоками. Используйте метод executeOnExecutor AsyncTask для запуска AsynTask в ExecutorService. – jimmy0251
Задача Async не подходит для этой цели, так как ОС может убить приложение в любое время. Во-вторых, почему так много обработки на стороне клиента, работа должна выполняться на сервере. –
Проблема, с которой я сталкиваюсь, требует обработки на стороне клиента, вот почему. Существуют еще более крупные задачи, такие как генерация данных, которые приложение потребляет, что действительно выполняется на сервере. Список (который работает цикл for) - это в основном поэтапная коллекция этого огромного набора данных, который сервер распадается и загружается в приложение. –