Шаблон для нескольких загрузчиков с помощью LoaderManager?

Я использую фрагменты и LoaderManager. Мне нужно запустить неизвестное количество задач, и они могут выполняться параллельно (иначе я бы просто повторно использовал один и только один загрузчик). Например, у меня есть список, и в каждой строке может быть кнопка для сохранения содержимого этой строки на веб-сервере. Пользователь может инициировать запрос на сохранение нескольких элементов параллельно.

private int nextId = 0;

private void onClickListener() {
    Bundle bundle = new Bundle();
    bundle.putNextData(...);
    getLoaderManager().initLoader(nextId++, bundle, this);
}

Я мог бы попробовать вести бухгалтерию сам, поэтому создайте пул загрузчиков вручную и, когда это возможно, используйте их повторно, похоже, это может быть что-то уже реализованное API?

Спасибо


person user291701    schedule 16.02.2012    source источник
comment
Хороший вопрос. Вам удалось ее решить? Я думаю, что вы должны как-то поставить свои задачи в очередь.   -  person Michał Klimczak    schedule 01.06.2012


Ответы (3)


Я не думаю, что вам следует использовать загрузчик для сохранения данных на удаленный сервер.

Вместо этого используйте IntentService или нечто подобное для обработки очереди " операции «сохранить». Таким образом, ваш обмен данными с веб-сервером может быть пакетным, свернутым (т. е. несколько сохранений в очереди для одного элемента могут быть свернуты в одну операцию) и, при необходимости, будут продолжаться после окончания срока действия вашей активности.

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

person Roman Nurik    schedule 17.08.2012
comment
А что, если у меня есть n категорий в базе данных, и я хотел бы загрузить их, используя CursorLoader. Какие идентификаторы мне следует использовать? - person pixel; 20.08.2012
comment
Конечно, вы можете использовать произвольные идентификаторы и, возможно, просто целые числа 1..n, если категории статичны. Если вы сначала загружаете список категорий, а затем детали по каждой категории, вам, вероятно, нужно оптимизировать свой запрос. Но если у вас нет другого варианта, вы должны использовать стабильные идентификаторы в качестве идентификаторов загрузчика, а не, например. позиции курсора. - person Roman Nurik; 20.08.2012

Для этого всегда подходят IntentService или связанная служба. Как указывает Роман, обратите внимание, что ставить в очередь несколько запросов и вызывать их по отдельности крайне не рекомендуется (весьма вероятно, что вы много работаете с радиосвязью — при использовании данных — что, среди прочего, разряжает вашу батарею. Вот обязательно прочитайте об этом)

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

Сообщите нам о своем прогрессе.

person Jose L Ugia    schedule 18.08.2012

Вы находитесь в правильном направлении, позвольте мне просто помочь вам немного.

Повторное использование действительно хорошая идея, и вам не нужно об этом беспокоиться, потому что Android сделал это за вас (или на самом деле Java;)

Он называется ThreadPoolExecuter, вы можете запустить столько задач, сколько пожелаете. и он будет открывать только предопределенное количество потоков (лучшая практика - пытаться открыть столько потоков, сколько параллельных сетевых подключений может быть запущено на устройстве. По моим исследованиям, это от 4 до 9).

И если вы пытаетесь загрузить один и тот же URL дважды, возможно, вы можете защитить себя и открыть для него только одну задачу.

person Ilya Gazman    schedule 20.08.2012