2010-04-06 7 views
5

Mit meiner Android-Anwendung, wenn ein Benutzer eine bestimmte Aktion ausführt, wird ein Hintergrunddienst gestartet, der den aktuellen GPS-Standort abruft und ihn zusätzlich in einer Datenbank speichert. In diesem Dienst verwende ich die requestLocationUpdates() aus der LocationManager Klasse und warten, bis die onLocationChanged() meiner LocationListener (die durch den Dienst implementiert ist) ausgelöst wird. Aber was ist der beste Weg auf die onLocationChanged zu warten? Soll ich einfach eine Variable abfragen und warten bis sie gesetzt ist? Irgendwelche Tipps?Was ist der beste Weg, um auf eine GPS-Positionsbestimmung zu warten?

Hinweis: Ich kann nicht einfach in die Datenbank in der onLocationChanged() wegen einiger anderer Sachen schreiben.

EDIT: Um meine Situation zu klären, kann ich ein Beispiel ähnlich meinem Fall vorstellen: Nehmen wir an, Benutzer drückt eine Taste und eine Methode myMethod wird ausgelöst, die ein Objekt zurückgibt. Dann, in diesem myMethod werde ich für Standort-Updates vom GPS registrieren (mit requestLocationChanged) und zusätzlich auf den Standort des Benutzers warten und es für etwas verwenden. Mit anderen Worten, myMethod kann nicht zurückkehren, bevor der Standort vorhanden ist. Ich weiß nicht, wie ich in diesem Fall onLocationChanged verwenden kann.

Antwort

3

Wenn der Speicherort festgelegt ist, wird onLocationChanged ausgelöst, sodass Sie keine Variablen abfragen müssen. Warum können Sie den Speicherort in onLocationChanged nicht speichern?

+1

Wahrscheinlich, weil der GPS-Empfänger in einem Hintergrunddienst und nicht sein Hauptprozess ist. – Segfault

+0

Wenn der Benutzer die Aktion ausführt, die den Standortabrufdienst auslöst, sollte meine Anwendung den aktuellen Speicherort abrufen, bevor es fortfährt. Nehmen wir an, Benutzer drückt eine Schaltfläche und eine Methode myMethod wird ausgelöst, die ein Objekt zurückgibt.Dann, in diesem myMethod werde ich für Standort-Updates vom GPS (mit requestLocationChanged) registrieren und zusätzlich auf den Standort des Benutzers warten und es für etwas verwenden. Mit anderen Worten, myMethod kann nicht zurückkehren, bevor der Standort vorhanden ist. Ich weiß nicht, wie ich onLocationChanged in diesem Fall verwenden kann. – qtips

+1

Sie möchten also die Ausführung in myMethod anhalten, während Sie auf die Synchronisierung von gps warten und Ihnen einen Speicherort geben? Du solltest das nicht tun. Wenn dies erforderlich ist, sollten Sie einen Fortschrittsdialog anzeigen, der bei der Ausführung von onLocationChanged beendet wird. Und dann auch in onLocationChanged, was auch immer myMethod mit dem Standort tun muss. –

0

Was ich tue ist eine Ansicht auf dem Hauptbildschirm zu einem Fortschrittsbalken von unbestimmter Länge setzen, setzen Sie requestLocationUpdates() und kehren Sie einfach zurück zum Benutzer. Wenn Sie den Benutzer blockieren müssen, bis der Standort aufgelöst ist, können Sie ein Dialogfeld oberhalb Ihrer Aktivität öffnen, das keine Steuerelemente und keine Fortschrittsanzeige enthält. Dann können Sie in Ihrem onLocationChanged-Callback diesen Dialog schließen und mit Ihrem Geschäft fortfahren.

EDIT: Ich lese deine Frage noch einmal und ich denke, ich verstehe besser. Mein erster Vorschlag wäre, zu sehen, ob Sie Ihren Hintergrunddienst abschaffen können. Sie müssen sich keine Sorgen machen, dass die App beim Warten auf eine GPS-Sperre nicht mehr reagiert, da die GPS-API asynchron ist. Wenn Sie dies aus irgendeinem Grund nicht können, müssen Sie sich die Message Passing-API ansehen, damit Ihr Hintergrunddienst eine Nachricht an Ihre Hauptaktivität senden kann, wenn die GPS-Daten verfügbar sind. See the Developers guide.

0

Ich denke, Sie sollten Wait/Notify-Methoden verwenden. Sie sollten ein Sperrobjekt haben. Sie rufen lockObject.wait() in Ihrer Methode auf. Und Sie rufen lockObject.notify() in onLocationChanged auf. Auf diese Weise wird Ihre Methode erst zurückgegeben, wenn onLocationChanged empfangen wurde.

Eigentlich wäre die bessere Lösung, Ihr Design zu überprüfen und Ihre Methode asynchron zu machen, wenn es möglich ist.

0

Abhängig von meinem Verständnis der Frage und dem Lesen von Kommentaren, würde ich vorschlagen, dass Sie die ursprüngliche Position mit getLastKnownLocation() der LocationManager Klasse nehmen. Melden Sie sich auch für das Ereignis onLocationChanged an. Jetzt können Sie in dieser Event-Handler-Funktion alles tun, was Sie wollen, während Sie im Frontend weitermachen. Wenn Sie den aktuellen Standort benötigen, können Sie auch auf requestLocationUpdates() warten, um zu antworten. Es ist wahrscheinlich keine gute Idee, den Benutzer warten zu lassen, während sich Ihre App auf eine Aufgabe vorbereitet. Wie von anderen vorgeschlagen, können Sie hier einen Fortschrittsbalken verwenden.