2014-01-23 4 views
5

Ich arbeite an einer App, die aus einem Service und einer Aktivität besteht. Der Dienst verwendet ein LocationClient-Objekt, um den aktuellen Standort jede Minute anzufordern. Die Aktivität verwendet ein anderes LocationClient-Objekt, um eine einzelne aktuelle Position anzufordern, nachdem auf eine Schaltfläche geklickt wurde.Mehrere LocationClients stören?

Im Dienst:

mLocationRequest = LocationRequest.create(); 
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
mLocationRequest.setInterval(60000); 
mLocationRequest.setFastestInterval(60000); 
mLocationClient = new LocationClient(this, this, this); 
// ... when connected: 
mLocationClient.requestLocationUpdates(mLocationRequest, this); 

In der Aktivität:

mLocationRequest = LocationRequest.create(); 
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
mLocationRequest.setInterval(0); // 0 should be ok since only a single location is requested 
mLocationRequest.setFastestInterval(0); 
mLocationRequest.setNumUpdates(1); // get only a single location 
mLocationClient = new LocationClient(this, this, this); 
// ... when connected: 
mLocationClient.requestLocationUpdates(mLocationRequest, this); 

Der Service allein funktioniert wie erwartet.

Wenn jedoch der Dienst gestartet wird und die Aktivität versucht, einen einzelnen aktuellen Standort abzurufen, wird der Standort erst empfangen, wenn der Dienst einen aktualisierten Standort erhält. Die Aktivität muss also bis zu 60 Sekunden warten.

Aber wenn der Dienst nicht und die Aktivität versucht beginnt einen einzigen aktuellen Standort zu erhalten, dann erhält er die Position nach kurzer Zeit wie erwartet (in der Regel < 5 Sek.).

Was verursacht das Problem? Ist nur ein LocationListener pro App erlaubt?

Antwort

1

Zuerst - wenn Sie einen sofortigen Standort benötigen, fordern Sie keine Standortaktualisierungen an, rufen Sie einfach getLastLocation() auf Ihrem Standort-Client auf. Dadurch erhalten Sie das beste/neueste Standortergebnis, wenn LocationClient eins verfügbar ist. Wenn nicht, würde ich Updates anfordern. Ich glaube nicht, dass die Anzahl der Standort-Clients in einer einzigen App begrenzt ist. Ich denke jedoch, dass Sie nicht wissen, wie diese Kunden mit den Google Play-Diensten interagieren, um Updates zu erhalten. Ein Blick auf die docs bietet einige Einblicke.

Wenn Sie zu dem Teil über die Angabe von Update-Parametern herunterscrollen, werden Sie sehen, dass LocationClient Art von zwischen Ihnen und den Standortdaten, die Sie suchen, sitzt. Alle anderen Apps auf dem Telefon, die LocationClient implementieren, versuchen, auf dieselben Daten zuzugreifen. LocationClient versucht Ihre Anfrage innerhalb des von Ihnen gewünschten Intervalls zu beantworten. Da andere Apps, die LocationClient verwenden, möglicherweise versuchen, auf dieselben Daten zuzugreifen, ist das Timing nicht garantiert. Das beste Beispiel hierfür ist setFastestInterval():

Aufrufen von LocationRequest.setFastestInterval() hilft auch Strom zu sparen. Wenn Sie eine bevorzugte Aktualisierungsrate anfordern, indem Sie LocationRequest.setInterval() und eine maximale Rate aufrufen, indem Sie LocationRequest.setFastestInterval() aufrufen, erhält Ihre App dieselbe Aktualisierungsrate als schnellste Rate im System. Wenn andere Apps eine schnellere Rate angefordert haben, erhalten Sie den Vorteil einer höheren Rate. Wenn keine anderen Apps mit einer höheren Rate von ausstehen, erhält Ihre App Updates mit der Rate, die Sie mit LocationRequest.setInterval() angegeben haben.

Wenn Sie ein Update erhalten, ist nicht direkt verknüpft, wenn Sie es angefordert haben. Manchmal wird es früher sein, manchmal wird es später sein. Die Intervalle sind nur eine Präferenz.

+0

Ich weiß, dass das Timing nicht garantiert ist.;-) Aber wenn ich die Dokumentation richtig verstehe, versucht der Ortungsdienst, das kleinstmögliche Intervall zu verwenden, das von den registrierten LocationRequests angegeben wird. In meinem Fall ist dies die Aktivität, nicht die der Dienstleistung. Ein anderes Beispiel: Wenn "Meine Tracks" den Ort jede Minute im Hintergrund verfolgt, kann meine Aktivität den aktuellen Ort immer noch viel schneller erreichen (~ 3 Sek.) - ohne die Interna von "Meine Tracks" zu kennen. Die Verwendung der beiden LocationClients über meiner Aktivität wartet jedoch immer auf die vom Dienst festgelegte Zeit. – Biggie

+0

Beachten Sie die Dokumentation: "Diese Methode legt die Rate in Millisekunden fest, zu der Ihre App bevorzugt Standortaktualisierungen empfängt. Wenn keine anderen Apps Updates von den Standortdiensten erhalten, erhält Ihre App Updates mit dieser Rate." Die Dokumentation spricht von "der App" und nicht vom "LocationClient/LocationListener-Objekt". Deshalb habe ich nach Problemen mit mehreren LocationClients in der gleichen App gefragt. Für mich scheint es, als ob das erste Intervall in einem der LocationClients der App gewonnen hat. In meinem Fall das 60-Sekunden-Intervall des Dienstes. – Biggie

+0

Nun, es gibt nichts in der Dokumentation, das LocationClient auf eine Instanz pro App beschränkt. Aber der Punkt, an dem Aktualisierungen App-weit sind, ist es wert, dass sie untersucht werden. Das ist mein Punkt bei Google Play Services. Es gibt nur eine Instanz/Version davon pro Telefon. Wenn Sie Updates über den LocationClient von den Play Services anfordern müssen, würde ich mir vorstellen, dass die letzte Anfrage die folgende wäre. Sie sollten die Werte wechseln und sehen, ob Sie das gegenteilige Ergebnis erhalten. – Rarw

Verwandte Themen