2016-03-25 6 views
3

Ich benutze Google Places API, und ich muss Ort Details mit Ort ID abrufen. Ich versuche, Methode getPlaceById() aufzurufen, aber es schlägt immer fehl. Hier ist das Protokoll:getPlaceByID() schlägt immer mit java.lang.IllegalArgumentException fehl: Puffer ist geschlossen

java.lang.IllegalArgumentException: Buffer is closed. 
at com.google.android.gms.common.data.DataHolder.zzg(Unknown Source) 
at com.google.android.gms.common.data.DataHolder.zzi(Unknown Source) 
at com.google.android.gms.common.data.zzc.zzcB(Unknown Source) 
at com.google.android.gms.location.places.internal.zzt.zzG(Unknown Source) 
at com.google.android.gms.location.places.internal.zzb.getPlaceId(Unknown Source) 
at .onPredictionSelected(CreateLocationActivity.java:181) 
at .AutocompletePredictionsHelper.onItemClick(AutocompletePredictionsHelper.java:51) 
at android.widget.AutoCompleteTextView.performCompletion(AutoCompleteTextView.java:905) 
at android.widget.AutoCompleteTextView.access$400(AutoCompleteTextView.java:90) 
at android.widget.AutoCompleteTextView$DropDownItemClickListener.onItemClick(AutoCompleteTextView.java:1195) 
at android.widget.AdapterView.performItemClick(AdapterView.java:300) 
at android.widget.AbsListView.performItemClick(AbsListView.java:1247) 
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3215) 
at android.widget.AbsListView$3.run(AbsListView.java:4009) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:155) 
at android.app.ActivityThread.main(ActivityThread.java:5696) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823) 

Mein Code:

public void onPredictionSelected(AutocompletePrediction prediction) { 
    if (!googleApiClient.isConnected()) return; 
    PendingResult<PlaceBuffer> result = 
      Places.GeoDataApi.getPlaceById(googleApiClient, prediction.getPlaceId()); 
    result.setResultCallback(places -> { 
     if (places.getCount() > 0) 
      place = places.get(0); 
     places.release(); 
    }); 
} 

Es ist ziemlich merkwürdig, weil Google Places API korrekt angeschlossen ist. Was könnte der Grund für diese Ausnahme sein?

Antwort

9

Wenn Sie möchten, in dem Puffer enthalten sind unter Verwendung des Objekts fortgesetzt, nachdem Sie den Puffer freigegeben haben, freeze() auf das Objekt aufrufen, bevor release()

rufen Sie isDataValid() jederzeit nutzen können, wenn das Objekt zu bestimmen, ist verfügbar oder nicht. Zum Beispiel gibt place.isDataValid() wahr vor dem Aufruf an buffer.release() und false danach zurück. Beachten Sie, dass frozen.isDataValid() Wahr sowohl vor als auch nach dem Freigeben des Puffers zurückgibt.

Referenzhttps://developers.google.com/places/android-api/buffers

+0

Dank für Ihre Antwort. Sieht so aus, als ob 'AutocompletePredictionBuffer.release() 'vor meiner' onPredictionSelected()' Methode aufgerufen wurde. Deshalb wurde Puffer geschlossen =) – hornet2319

2

Ein guter Weg zu starten ist durch Protokollieren, was los ist. Sie können überprüfen, ob das Ergebnis der Operation war erfolgreich Ihre durch Refactoring if-Anweisung wie folgt:

if (places.getStatus().isSuccess() && places.getCount() > 0) 

Überprüfen Sie die Meldung des Status für weitere Informationen:

String msg = places.getStatus().getStatusMessage(); 
Log.e(<some TAG>, "Status message: " + msg); 

Dann schauen Sie sich einfach die LogCat für die Statusmeldung Das ist keine echte Antwort, aber es würde Ihnen auf jeden Fall Hinweise geben, wie es weitergehen soll.

+0

Dank für nützliche Informationen +1 – hornet2319

Verwandte Themen