Шаблон для нескольких загрузчиков с LoaderManager?
Я использую Fragments и LoaderManager. Я должен запустить неизвестное количество задач, и они могут запускаться параллельно (в противном случае я бы просто использовал один и только один загрузчик). Например, у меня есть listview, и каждая строка может иметь кнопку для сохранения содержимого этой строки на веб-сервере. Пользователь может инициировать запрос на сохранение нескольких элементов параллельно.
private int nextId = 0;
private void onClickListener() {
Bundle bundle = new Bundle();
bundle.putNextData(...);
getLoaderManager().initLoader(nextId++, bundle, this);
}
Я мог бы сам выполнить бухгалтерию, поэтому создайте пул загрузчиков вручную и, если возможно, повторно используйте их, похоже, что это может быть уже реализовано API?
Спасибо
Ответы
Ответ 1
Я не думаю, что вы должны использовать Loader для сохранения данных на удаленном сервере.
Вместо этого используйте IntentService
или что-то похожее на обработку очереди операций "сохранить". Таким образом, ваша связь с веб-сервером может быть упакована, скомпенсирована (т.е. Несколько резервных копий для одного элемента могут быть свернуты в одну операцию) и, если потребуется, будут жить за пределы срока действия вашей деятельности.
Сохраненная очередь, обработанная IntentService
(или эквивалентом), также является отличным способом повторить неудачные операции с отсрочкой, поскольку вы можете реализовать отложенные повторы с экспоненциальным отсрочкой, используя AlarmManager
.
Ответ 2
Служба IntentService или связанная служба всегда являются хорошими подходами для этого.
Как отмечают римские точки, обратите внимание, что включение нескольких запросов и их вызов по отдельности не рекомендуется (очень вероятно, что вы приложите много усилий для радиосвязи - при использовании данных, которые, помимо прочего, разряжают батарею. href= "http://developer.android.com/training/efficient-downloads/efficient-network-access.html" rel= "nofollow" > обязательно прочитать об этом)
Я лично рекомендовал бы использовать связанный сервис с очередью запросов и пулом доступных потоков (этот подход дает вам полный контроль над более сложными сетевыми операциями, например, в вашем случае). Более подробная информация о подходе here и пример тестового примера над здесь.
Обновите нас о ваших успехах.
Ответ 3
Вы находитесь в правильном направлении, позвольте мне немного помочь вам.
Повторное использование действительно хорошая идея, и вам не нужно беспокоиться об этом, потому что Android сделал это за вас (или Java на самом деле;)
Он называется ThreadPoolExecuter, вы можете запустить столько задач, сколько пожелаете, и он только откроет предопределенное количество потоков. (Лучшая практика - пытаясь открыть столько потоков, сколько параллельное сетевое соединение может быть запущено на устройстве. Из моего исследования это между 4 - 9).
И если вы пытаетесь загрузить один и тот же URL дважды, возможно, вы можете защитить себя и открыть для него только одну задачу.