0

У меня есть цикл 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, но просмотр кода меня смутил. Это решение? Если да, то как использовать его в этом сценарии (для кода выше). Пожалуйста, предложите решение - спасибо!

+1

Используйте ExecutorService как fixedThreadPool с 5 потоками. Используйте метод executeOnExecutor AsyncTask для запуска AsynTask в ExecutorService. – jimmy0251

+0

Задача Async не подходит для этой цели, так как ОС может убить приложение в любое время. Во-вторых, почему так много обработки на стороне клиента, работа должна выполняться на сервере. –

+0

Проблема, с которой я сталкиваюсь, требует обработки на стороне клиента, вот почему. Существуют еще более крупные задачи, такие как генерация данных, которые приложение потребляет, что действительно выполняется на сервере. Список (который работает цикл for) - это в основном поэтапная коллекция этого огромного набора данных, который сервер распадается и загружается в приложение. –

ответ

2

Для этой цели вы должны использовать ExecutorService.

Исполнитель-исполнитель Службы = Исполнители.newFixedThreadPool (5);

новый MyAsyncTask(). ExecuteOnExecutor (executorService);

+0

Это отлично работает, спасибо. Как насчет того, чтобы пользователь нажал кнопку «вверх»? Есть ли решение для этого, используя это? –

+0

Вам нужно будет спуститься по маршруту PriorityBlockingQueue и ThreadPoolExecutor, если вы хотите присвоить разные задачи приоритету. –

Смежные вопросы