Android - AppWidgets, AlarmManager и AsyncTask
-
16-09-2019 - |
Вопрос
Мне не очень везет с обновлением виджета приложения с AlarmManager
сгенерированные трансляции.Вот что я делаю:
Инициализация AlarmManager
на AppWidgetProvider#onEnabled
AlarmManager alarms = (AlarmManager) context.getSystemService(
Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), 60000, pendingIntent);
Я также определяю широковещательный приемник, который просто прослушивает обновления, запущенные AlarmManager
.При запуске обновления выполняется код AsyncTask
это вызывает сетевой вызов.Когда в AsyncTask
завершено (onPostExecute
) он использует ранее полученный экземпляр AppWidgetManager
чтобы обновить виджет (ы).Все это на самом деле работает хорошо, пока в журналах я не увижу сообщение "Process com.foo.myapp (pid 12345) has died"
после чего AlarmManager
никогда не запускает другое обновление.
Нужно ли мне иметь какую-то проверку, которая перезапустит сигналы тревоги?Например, когда пользователь получает доступ к родительскому приложению виджета?Как мне гарантировать, что я смогу завершить длительную задачу и вернуться к виджету, если мое приложение завершит работу в середине запроса?
Решение
При запуске обновления выполняется код AsyncTask, который выполняет сетевой вызов.
Если это находится внутри BroadcastReceiver
, это не сработает.Вы не можете безопасно разветвлять потоки из BroadcastReceiver
, и AsyncTask
эффективно разветвляет поток для выполнения своей задачи асинхронно.
Вместо этого вам следует делегировать длительную работу обслуживание началось с сигнала тревоги BroadcastReceiver
.