2016-07-02 12 views
0

Frage: Was ist der sauberste Weg, um ein Place Objekt aus einem ID-String zu erstellen?Wie verwende ich GeoDataApi.getPlaceById?

Ich möchte einige place Objekte aus fest codierten IDs machen. Denken Sie etwas wie Place place1 = new Place("ChIJS_zBNNbXAhURy-FuRT5ib9k"), aber das funktioniert natürlich nicht.

Ich stieß auf GeoDataApi.getPlaceById, aber die Dokumentation ist verwirrend.

Das API in der Regel zum Nachschlagen, was ein Benutzer Eingabe (optional mit Auto-Vervollständigung) verwendet wird, aber ich etwas kleine und sauberes muß (man denkt: Einheit Testzwecke)


Meine Forschung: How to get a Place by ID

Um einen Ort nach ID zu erhalten, rufen Sie GeoDataApi.getPlaceById an und übergeben Sie eine oder mehrere Ortskennungen.

Die API gibt eine PlaceBuffer in einer PendingResult zurück. Die PlaceBuffer enthält eine Liste von Place Objekten, die den angegebenen Platzkennungen entsprechen.

Dokumentation:

Place (das Objekt erforderlich)

PlaceBuffer (konvertierbar zu einem Platz)

PendingResult

getPlaceById (gibt einen PendingResult)


Was ich mit bin stecken: Ich kann nicht eine elegante Art und Weise finden eine PendingResult in eine PlaceBuffer einzuschalten.

Die API gibt eine PlaceBuffer in einer PendingResult zurück.

...

Das Endergebnis Objekt aus einem PendingResult<R> ist vom Typ R, die in einer von zwei Arten abgerufen werden können.

  • über in einem Objekt, indem Schnittstelle ResultCallback zu setResultCallback(ResultCallback) Umsetzung Anrufe await() oder await(long, TimeUnit) oder
  • über einen Rückruf zu blockieren.

Ein Rückruf ist zu chaotisch, und ich kann keinen Code finden, die await daraus lernen verwendet.

+1

Ich fand ein Beispiel unter http://www.truiton.com/2015/04/android-places-api-autocomplete-getplacebyid/ – xomena

+0

@xomena Ich sah bereits, dass & das gelesen haben. Einige 'ctrl + f' helfen bei so großen Code-Schnipsel. Das hilft kaum. –

Antwort

1

Sie können sehr einfach einen PendingResult von getPlaceById in einen PlaceBuffer drehen. Sie rufen einfach die await() Methode:

PendingResult<PlaceBuffer> result = Places.GeoDataApi.getPlaceById(
     mGoogleApiClient, placeId); 
PlaceBuffer placeBuffer = result.await(); 

(Sie könnten natürlich in einer Zeile zu tun, dass, wenn Sie es vorziehen.)

Es gibt Beispiele für GeoDataApi.getPlaceByID und PendingResult<PlaceBuffer>.await in https://github.com/googlesamples/android-play-places aufrufen.

+0

'Das zurückgegebene Ergebnisobjekt kann einen zusätzlichen Fehlermodus INTERRUPTED haben. - Wie gehen Sie damit um? –

+1

Die gleiche Art, wie Sie mit einem anderen Fehlerstatus in 'PlaceBuffer' umgehen würden. Z.B. 'if (! placeBuffer.getStatus(). isSuccess()) {reportErrorSomewhere (placeBuffer.getStatus(). toString()); } ' – spiv