Фоновая работа - служба, поток или оба - PullRequest
2 голосов
/ 20 июня 2011

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

Я читал об использовании Handler и Looper.Нужно ли их интегрировать в сервис?Или мне просто использовать их?

РЕДАКТИРОВАТЬ:

Может быть, я не совсем понял.Я хочу получить данные с веб-страницы, которая будет отображаться на моем устройстве.Я нашел пример загрузки изображения «Ленивый список», который выглядит многообещающе, но имеет некоторые недостатки.Он создал очередь изображений, которые он загружал по одному, а затем обновил представление списка.хотя это была просто тема.

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

Ответы [ 3 ]

1 голос
/ 20 июня 2011

Это зависит от того, насколько «фоновым» будет процесс.Если вы хотите получить данные с веб-сайта без ведома пользователя, вам следует использовать Service + AsyncTask (вам все равно нужен AsyncTask, поскольку по умолчанию Service запускается втот же поток / процесс, что и в пользовательском интерфейсе - поэтому, если вы выполняете какие-либо длительные задачи без отдельного потока, вы блокируете поток пользовательского интерфейса, и это будет довольно неприятно).

Однако такой подход приведет кдругие головные боли.Например, вам нужно будет найти способ запустить службу - либо используйте AlarmManager для ее регулярного запуска, либо найдите какой-то другой механизм (например, прослушайте намерение вещания).

Другой подход заключается в загрузке данных в Activity, показывая пользователю сообщение о загрузке (вы можете посмотреть ProgressDialog).Таким образом, пользователь знает, что вы делаете, и вы можете очень просто реализовать функцию «обновления».

В обоих случаях у вас есть довольно много вариантов хранения.Вы можете:

  • сохранять файлы, которые вы извлекаете, непосредственно в dir / sdcard кэша (проверьте getCacheDir() на Context)
  • , если вы выполняете синтаксический анализ (JSON / XMLнапример) вы можете хранить сериализованные объекты в кеше dir / sdcard, чтобы вам не приходилось анализировать их снова
  • вы можете использовать базу данных sqlite (на сайте разработчика Android есть документы и руководства)

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

1 голос
/ 20 июня 2011

У вас, кажется, есть несколько требований:

  1. Кэширование небольшого количества данных из Интернета
  2. Динамическое получение этих данных в фоновом режиме
  3. Использование этих данных во всехнесколько действий
  4. Возможность обрабатывать несколько одновременных запросов

В пункте 2 предлагается, чтобы вам требовался отдельный поток, если вы не хотите влиять на производительность потока пользовательского интерфейса.Пункт 3 предполагает, что вам нужна услуга.Пункты 1 и 4 предполагают, что какая-то очередь может быть полезной.

Единственный класс, который объединяет все это - IntentService.Посмотрите на это.Он в основном ставит в очередь и обрабатывает запросы в фоновом режиме в рабочем потоке.Поскольку это все интернет-данные, вы можете просто передать его Намерение с помощью URI, и вы можете IntentService сделать загрузку за вас.Возможно, вы захотите передать ResultReceiver с намерением, чтобы после завершения загрузки вы могли сообщить об активности, которую вы завершили, этим URI.

1 голос
/ 20 июня 2011

Непонятно, каков ваш конкретный вариант использования. Если вы хотите предварительно загрузить некоторые изображения, которые будут доступны, независимо от того, является ли ваше приложение видимым или нет, вам следует подумать о сервисе.

Однако, если вы просто хотите кэшировать изображения, загруженные в текущем действии, AsyncTask может быть лучшим выбором.

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

...