Когда приложение переходит на задний план во время выполнения AsyncTask, что он должен делать?

У меня есть приложение, которое использует AsyncTasks для совершения вызовов на сервер REST.

Представьте, что в течение периода загрузки (это AsyncTask переходит на сервер REST и получает данные на следующий экран), пользователь нажимает "Домой".

Рекомендуем:

  • Отмените текущую AsyncTask и перезапустите при возобновлении действия

или

  • Продолжайте работу с AsyncTasks, но избегайте startActivity, проверяя, включено ли приложение в фоновом режиме (чтобы избежать переднего плана нового действия после отправки приложения в фоновый режим). И onResume отправки следующего действия

Наиболее вероятные сценарии, которые вы должны предвидеть:

  • Приложение переходит в фоновый режим и убивается из-за нехватки памяти.
  • Асинхронность не выполняется из-за таймаута или другой ошибки REST

После этого пользователь возвращается к приложению...

Ответы

Ответ 1

Хорошо, я рекомендую Сервис, который должен использовать AsyncTask для выполнения своей работы. Служба отключит вашу деятельность от изменения ориентации или выхода пользователя. AsycnTask будет изолировать от блокировки пользовательского интерфейса. Но не забудьте выйти из службы, когда вы закончите с помощью REST api.

Это даст вам лучшее из того и другого. Кроме того, если вы не используете DB в качестве локального кеша, вы можете попробовать это тоже. Таким образом, даже если пользователь уйдет, служба сохранит выбранные данные в БД и, когда пользователь вернется, вы сможете быстро отобразить экран.

EDIT: просто хочу добавить IntentService, которые легко реализовать.

Попробуйте Шаблоны проектирования для клиентов REST на Android от Google для более полного объяснения

Ответ 2

Использование AsyncTasks может стать действительно беспорядочным во время изменения конфигурации. Из личного опыта я бы рекомендовал использовать маршрут IntentService/ResultReceiver.

Смотрите это сообщение для получения дополнительной информации:

Служба Restful API

Ответ 3

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

С технической точки зрения, я не использовал бы сервис. Я бы просто оставил работу AsyncTask. И в худшем случае, когда приложение убивается между ними, приложение автоматически переходит в начальную активность, когда пользователь возвращается к приложению, потому что приложение перезапускается в любом случае. В случае сбоя асинхронной проверки вы можете проверить, были ли данные успешно загружены и если они не показывали начальную активность. Вы можете легко реализовать это, сохранив загруженные данные в переменной, начальное значение которой равно null. Если переменная остается пустой после загрузки, AsyncTask потерпел неудачу, и вам нужно перейти в начальную операцию. Я думаю, что это довольно надежная реализация.

Ответ 4

загрузка продолжается, как и приложение для Android, но оно показывает уведомление с возможностью отмены. Вы можете реализовать это, используя сервис для загрузки.