servizio di Android con callback LocationListener
-
04-10-2019 - |
Domanda
Ho un'applicazione Android. In base alla posizione geo corrente dell'utente, voglio recuperare alcuni dati remoti in background e conservarla. La mia applicazione è:
A determinato intervallo di un allarme di incendi fino il mio servizio. Service utilizza una classe anonima alla domanda posizione corrente e registra un callback LocationListener. Su chiamata di onLocationChanged () Io inizio i dati remoti recuperano dal server.
Tuttavia una volta che il mio servizio è fatto registrare l'ascoltatore posizione utilizzando anonymos classe, restituisce come previsto; in quanto non aspetta che di callback per accadere prima di finire. Dal momento che callback richiede un po 'di tempo ed effettua una chiamata quando il servizio è già tornato, getta un errore che dice:
java.lang.RuntimeException: Handler{43e82510} sending message to a Handler on a dead thread
Il che è abbastanza comprensibile. Una soluzione rapida per me ora è che posso usare getLastKnownLocation da locationManager come che non risponde indietro di callback; ma cosa succede se voglio l'ultima località al momento, in un'attività di servizio e non? Come posso aspettare per callback per succedere e fermare il mio servizio di tornare.
Inoltre, a che punto lastKnownlocation viene aggiornato? GPS Ogni volta registra una nuova posizione; vuol aggiornarlo? Quello che voglio sapere è che se non è più recente può ancora essere chiusa al più recente? Come non ho visto un'opzione in emulatore Android per configurare il periodo di tempo tra gli aggiornamenti successivi.
Ogni aiuto è molto apprezzato. Acclamazioni
Soluzione
, ma cosa succede se voglio l'ultima località al momento, in un'attività di servizio e non?
Siamo spiacenti, ma questo non è possibile, sia in un servizio o un'attività. Ad esempio, se la radio GPS è spento, e si richiede dati di posizione dal GPS, ci vorranno decine di secondi solo per ottenere una correzione, e che, se si è fortunati. Potrebbe non ottenere una correzione a tutti.
Come posso aspettare per callback per succedere e fermare il mio servizio di tornare.
Non lo sai. Tu fai quello che hai detto avresti fatto:
uso getLastKnownLocation da locationManager come che non risponde indietro di callback
Quindi, avere il vostro Service
(che si spera un IntentService
) verificare se getLastKnownLocation()
succede ad avere un valore. Se lo fa, usarlo. In caso contrario, registerLocationUpdates()
utilizzando un PendingIntent
che passerà il controllo al vostro IntentService
. Quando si arriva che Intent
, utilizzare la posizione e annullare la registrazione per gli aggiornamenti (assumendo il periodo di allarme è bella e lunga, come, ad esempio, una volta ogni ora).
Cose ottenere difficile se il vostro allarme è un allarme _WAKEUP. Sarà quindi necessario per tenere una WakeLock
, in modo che il dispositivo non ricadere addormentato mentre si sta cercando di ottenere una posizione GPS. Tuttavia, è necessario rilasciare che a volte WakeLock
, e se non siamo in grado di ottenere una posizione GPS ... ummm ... beh, questo è la parte difficile. Cercando di capire un bel modo pulito di gestire questo, e l'attuazione di esso come un componente riutilizzabile (ad esempio, LocationAlarmService
), è uno dei 18.000 articoli sul mio to-do list.
Inoltre, a che punto lastKnownlocation viene aggiornato? GPS Ogni volta registra una nuova posizione; Non mi> aggiornarlo?
Per quanto ne so, sì.