Представьте типичный сценарий, когда открывается действие, необходимо вызвать REST HTTP API для получения некоторого контента и после получения обновлений пользовательского интерфейса. Очевидно, что вызов API должен выполняться в отдельном потоке, но должен ли он выполняться с использованием AsyncTask, IntentService или другого подхода и почему?
Сделать вызов API REST из IntentService или AsyncTask?
Ответ 1
Я бы рекомендовал сочетание IntentService
и ResultReceiver
, как описано в этом сообщении.
Также посмотрите Google iosched, который реализует эту модель. В версии 2010 года показано, как сохранить ResultReceiver
в соответствии с изменениями конфигурации (например, вращением экрана) с помощью onRetainNonConfigurationInstance
, getLastNonConfigurationInstance
и статического класса.
Я успешно реализовал эту модель в приложении. Сообщите мне, есть ли у вас проблемы с предоставленными ссылками.
Изменить: я забыл вопрос "Почему";)
AsyncTask
тесно связан с активностью и не будет обрабатывать изменения конфигурации конфигурации. Это нормально для коротких задач в течение жизненного цикла (между onResume
и onPause
). Я использую HttpClient
для моих вызовов REST API с таймаутом соединения и тайм-аутом сокета, установленным в 20 секунд (из-за плохой мобильной сети...). Это означает, что вызов API может длиться до 40 секунд. Вы определенно хотите обрабатывать такую длинную задачу в службе, а не AsyncTask
.