Шаблон для нескольких загрузчиков с LoaderManager? - PullRequest
12 голосов
/ 16 февраля 2012

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

private int nextId = 0;

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

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

Спасибо

Ответы [ 3 ]

4 голосов
/ 17 августа 2012

Не думаю, что вам следует использовать Loader для сохранения данных на удаленном сервере.

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

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

1 голос
/ 18 августа 2012

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

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

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

0 голосов
/ 20 августа 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...