getPlaceByID() 总是失败并显示 java.lang.IllegalArgumentException:缓冲区已关闭

getPlaceByID() always fails with java.lang.IllegalArgumentException: Buffer is closed

我正在使用 Google 个地点 API,我需要使用地点 ID 检索地点详细信息。我正在尝试调用方法 getPlaceById(),但它总是失败。这是日志:

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.access0(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.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)

我的代码:

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();
    });
}

很奇怪,因为 Google 地方 API 已正确连接。 此异常的可能原因是什么?

开始的一个好方法是记录正在发生的事情。您可以通过像这样重构您的 if 语句来验证操作结果是否成功:

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

查看状态消息以获取更多信息:

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

然后只需检查 LogCat 的状态消息。这不是一个真正的答案,但它肯定会给你一些关于如何继续的线索。

如果您想在释放缓冲区后继续使用缓冲区中包含的对象,请在调用 release()

之前对该对象调用 freeze()

You can use isDataValid() at any time to determine if the object is available or not. For example, place.isDataValid() returns true before the call to buffer.release() and false afterwards. Note that frozen.isDataValid() returns true both before and after the buffer has been released.

参考https://developers.google.com/places/android-api/buffers