Как запустить повторную попытку при сбое загрузки в AsyncTask с помощью AlarmManager - PullRequest
1 голос
/ 12 сентября 2010

Я использую AlarmManager для запуска службы, которая пытается загрузить файл из Интернета. Если это не удастся, я бы хотел повторить попытку через 5 минут.

Внутри службы я запускаю AsyncTask для запуска своего кода. Насколько я знаю, единственный способ определить, не удалось это или нет, это от onPostExecute().

Каков наилучший способ повторного запуска этой службы?

1 Ответ

3 голосов
/ 12 сентября 2010

Ответ Фалмарри правильный, и я не понимаю твоих опасений.

В onPostExecute(), когда вы определяете, что все пошло не так:

  1. Позвоните getSystemService(ALARM_SERVICE), чтобы получить AlarmManager
  2. Позвоните set() на AlarmManager, чтобы вызвать вас через 5 минут

При необходимости используйте дополнительные символы в Intent в PendingIntent, чтобы дать вам информацию о том, что нужно повторить, или используйте строку настраиваемого действия, чтобы отличить повторные попытки от запланированного сигнала тревоги, или что-то еще. Обратите внимание, что если вы используете Intent дополнительные функции, вам нужно будет выбрать соответствующий флаг с помощью PendingIntent (например, FLAG_UPDATE_CURRENT).

Проблема в том, что AlarmManager запускается из одного класса, но AsyncTask находится в другом классе, поэтому класс, который запускает AlarmManager, не знает, провалился он или нет.

Так? Несколько классов могут общаться с AlarmManager. Кроме того, не стесняйтесь передавать данные вашему подклассу AsyncTask через его конструктор.

Кроме того, вы можете рассмотреть возможность использования IntentService вместо Service и AsyncTask. IntentService автоматически создает фоновый поток. Кроме того, он отключается, когда больше не нужно выполнять работу, что также важно, так что вы не получаете кучу однозвездочных рейтингов на Рынке, жалующихся на службу, которую вы постоянно используете.

Я не хочу запускать AlarmManager из onPostExecute () моего класса Service.

Почему бы и нет?

Если я запускаю AlarmManager из Сервиса, я как бы создаю повторяющуюся функцию, где Я звоню в Службу от себя.

Конечно. Это то, что ты хочешь. Неважно, является ли Service, AsyncTask или MyOtherReallyCoolClass тем, кто на самом деле разговаривает с AlarmManager - компонент, который перепланирует Service, является самим Service.

...