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

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

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

Что рекомендуется:

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

или

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

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

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

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

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

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

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

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

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

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

Служба Restful API

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

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

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