Когда приложение переходит в фоновый режим во время выполнения AsyncTask, что оно должно делать? - PullRequest
14 голосов
/ 11 января 2012

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

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

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

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

или

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

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

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

После обоих пользователь возвращается в приложение ...

Ответы [ 4 ]

6 голосов
/ 14 января 2012

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

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

РЕДАКТИРОВАТЬ: просто хотите добавить IntentService легко реализовать.

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

3 голосов
/ 13 января 2012

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

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

Служба Restful API

1 голос
/ 14 января 2012

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

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

0 голосов
/ 13 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...