Question

Je ne suis pas beaucoup de chance avec la mise à jour d'un widget application avec des émissions générées par AlarmManager. Voici ce que je fais:

Initialiser AlarmManager sur AppWidgetProvider#onEnabled

AlarmManager alarms = (AlarmManager) context.getSystemService(
        Context.ALARM_SERVICE);
    alarms.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
    SystemClock.elapsedRealtime(), 60000, pendingIntent);

Je définis également récepteur de radiodiffusion qui écoute simplement les mises à jour qui ont tiré par le AlarmManager. Lorsque la mise à jour est le code renvoyé court AsyncTask qui effectue un appel réseau. Lorsque le AsyncTask est terminé (onPostExecute), il utilise par exemple obtenu précédemment de AppWidgetManager mettre à jour le widget (s). Tout va bien jusqu'à ce que fait dans les journaux que je vois un message "Process com.foo.myapp (pid 12345) has died" après quoi le AlarmManager ne déclenche une autre mise à jour.

Ai-je besoin d'avoir une sorte de contrôle qui redémarre les alarmes? Par exemple, lorsque l'utilisateur accéder à l'application parent du widget? Comment puis-je assurer que je peux terminer la tâche longue course et revenir au widget si mon application meurt au milieu de la demande?

Était-ce utile?

La solution

  

Lors de la mise à jour est tiré de code fonctionne   AsyncTask qui fait un appel réseau.

Si cela est à l'intérieur du BroadcastReceiver, qui ne fonctionnera pas. Vous ne pouvez pas fils en toute sécurité à partir d'une fourche BroadcastReceiver et AsyncTask fourches efficacement un thread pour sa tâche de manière asynchrone.

Au lieu de cela, vous devez déléguer le travail en cours d'exécution longue à un services commencé à partir de l'alarme BroadcastReceiver.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top