0

Вопрос: Какова наилучшая практика для отчета о ходе выполнения/завершения от долговременной задачи до Activity? И что делать, когда отчет о прогрессе/завершении происходит, когда активность изменяется в фоновом режиме/ориентации?Долгосрочные задачи с обратными вызовами активности или фрагмента

Пример реальной жизни: Активность делает сетевой вызов, получая данные с сервера (это может занять 10+ секунд). Когда этот сетевой вызов завершен, активность должна быть извещена, и действие должно показать, что сетевой вызов завершен.

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

Я смотрел на следующих способов сделать это, но я не могу решить, что делать:

  • службы, что порождает поток, где выполняется сетевой вызов. Служба привязана к Управлению. При завершении работы в сети вызов службы вызывает активность. Если «Активность» находится в фоновом режиме, когда служба выполняет обратный вызов (поэтому активность пропускает обратный вызов), должен ли Activity опросить службу для сохраненных данных?
  • IntentService, которая передает данные, когда сеть завершения вызова (что делать, если активность пропускает эту передачу, потому что это в фоновом режиме?)
  • AsyncTask, но это плохо, когда активность находится в фоновом режиме и т.д.

Как мне подойти к этой проблеме?

ответ

0

Я решил эту проблему, используя HeadlessFragments как ее называемый. This в блоге подробно объясняется, как его реализовать, и проблемы, о которых вы говорили, обрабатываются им.

EDIT: Для вопросов в комментарии:

  1. Для вашего конкретного вопроса, о обратных вызовов не теряются, когда Activity в фоновом режиме, ответ нет. Быть на «фоне» означает, что Activity все еще жив. Из ссылки, которую я опубликовал, callback, который является самим Activity, удаляется, когда его отсоединен от Activity, когда Activity равен destroyed. Итак, если ваш Activity находится в фоновом режиме, а не destroyed, он все равно получит callback и сделает все, что вы сделаете в этом callback. Хотя Android может убивать действия paused, в этом случае ваш Activity будет destroyed, и вы не получите callback. В таком случае вы можете либо сохранить данные, которые вы получаете с сервера, в постоянном хранилище, например SQLite, и предотвратить другой сетевой вызов или сделать сетевой вызов при создании Activity, который гарантирует, что всякий раз, когда Activity равен created, У вас есть данные для отображения (учитывая, конечно, вызов проходит).

  2. Использование Fragment предназначено только для работы с изменением конфигурации, которое вы упомянули в своем вопросе. Выполняемая задача все еще выполняется AsyncTask, а не Fragment. Fragment содержит только ссылку на объект. Поэтому я бы сказал, что это не «лучшая практика».

+0

Спасибо за ссылку. У меня есть два вопроса: Что делать, если задача завершается, когда действие находится в фоновом режиме. Тогда все обратные вызовы будут пропущены, не так ли? Как получить данные, которые были получены с сервера, когда активность была в фоновом режиме? Не похоже на «лучший способ» использовать фрагмент для запуска задач? Хотя я определенно вижу точку в этом подходе. Редактировать: Должен ли я хранить данные в файле HeadlessFragment, а затем запрашивать данные из фрагмента, если «TaskHasFinished»? –

+0

@JonasJensen см. Отредактированный ответ на ваши вопросы. – Nerd