Вопрос

Мне не очень везет с обновлением виджета приложения с 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top