0

Я использую threadpool с одним потоком для выполнения некоторых сетевых задач (их нужно выполнять последовательно) через зрителя в RecyclerView на Android. Он работает, если я медленно прокручиваю. Но если я прокручусь быстро, слишком много задач будет перенесено в очередь, которую я обнаружил через отладку, полностью блокирует очередь.ExecutorService один поток threadpool блокирует очередь, если выполняется слишком много запросов.

я упростил код (много), где я использую одну резьбовую ThreadPool:

if (executorService == null) { 
    executorService = Executors.newFixedThreadPool(1); 
} 

executorService.execute(new Runnable() { 
    @Override 
    public void run() { 
     RessourceService.getCoverPage(url, callback); 
     while (waiting) {} 
    } 
}); 

Так что альтернативы, если я хочу, чтобы выполнить сетевые задачи последовательно без получения заблокированной очереди ??

Любая помощь будет принята с благодарностью.

Обновление: Проблема была где-то еще в моем коде, а не в том, что было опубликовано выше. Как описано в моем вопросе, я выполняю запросы через посредника по просмотру. При быстрой прокрутке изображения не загружаются. Я узнал, что проблема возникла, когда предмет был вне поля зрения в recyclerview. Причиной этого было то, что запрос был заблокирован из-за того, что моя переменная «ожидание» была истинной. Я мог бы решить это, сделав его статическим и установив его в false перед каждым запросом и тем самым прекратив выполнение запроса в другом телезрителе. Тем не менее, предложение @Jessie Brian Revil об использовании newSingleThreadExecutor имеет смысл. Не прямое решение моей проблемы, а разумное решение для кода выше (поэтому принимаем).

ответ

1

Вы пробовали использовать newSingleThreadExecutor()

public static ExecutorService newSingleThreadExecutor() 

Создает Исполнитель, который использует один рабочий поток, работающий от с неограниченной очереди.

(Заметим, однако, что если один поток заканчивается из-за сбоя во время выполнения до выключения, новый будет занять свое место, если это необходимо для выполнения последующих задач.)

Задачи гарантированно выполнить последовательно, и не более одной задачи будет активным в любой момент времени. В отличие от эквивалентного в противном случае newFixedThreadPool (1) возвращенный исполнитель гарантированно не будет реконфигурируемый для использования дополнительных потоков.

+0

Спасибо! Однако проблема была где-то в моем коде, но ваш ответ по-прежнему был полезен. См. Редактирование моего вопроса. – Langkiller

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