Android - AppWidgets, AlarmManager e AsyncTask
-
16-09-2019 - |
Domanda
non sto avendo molta fortuna con l'aggiornamento di un widget di app con AlarmManager
generato trasmissioni. Ecco quello che faccio:
L'inizializzazione AlarmManager
su AppWidgetProvider#onEnabled
AlarmManager alarms = (AlarmManager) context.getSystemService(
Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), 60000, pendingIntent);
Ho anche definisco ricevitore trasmissione che ascolta solo per gli aggiornamenti che sparavano dal AlarmManager
. Quando l'aggiornamento è sparato codice viene eseguito AsyncTask
che effettua una chiamata di rete. Quando la AsyncTask
è completato (onPostExecute
) utilizza esempio precedentemente ottenuto di AppWidgetManager
per aggiornare il widget (s).
Tutto funziona bene fino a quando in realtà nei registri vedo messaggio "Process com.foo.myapp (pid 12345) has died"
dopo di che il AlarmManager
mai spara un altro aggiornamento.
Ho bisogno di avere un qualche tipo di controllo che si riavvierà gli allarmi? Per esempio quando l'utente accede l'applicazione madre del widget? Come faccio a garantire che posso completare l'operazione lunga corsa e tornare al widget se la mia app muore nel mezzo della richiesta?
Soluzione
Quando l'aggiornamento si esegue il codice licenziato AsyncTask che effettua una chiamata di rete.
Se questo è all'interno del BroadcastReceiver
, che non funzionerà. Non si può tranquillamente discussioni forcella da un BroadcastReceiver
e AsyncTask
forcelle efficacemente un thread per eseguire il suo compito in modo asincrono.
Invece, si dovrebbe delegare annoso lavoro ad un servizio iniziato da l'allarme BroadcastReceiver
.