我使用Google Places 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.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)
我的代码:
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 Places API已正确连接。 这种例外的可能原因是什么?
答案 0 :(得分:11)
如果要在释放缓冲区后继续使用缓冲区中包含的对象,请在调用freeze()
之前调用对象上的release()
您可以随时使用
isDataValid()
来确定对象是否可用。例如,place.isDataValid()
在调用buffer.release()
之前返回true,之后返回false。请注意,frozen.isDataValid()
在缓冲区释放之前和之后都返回true。
答案 1 :(得分:2)
一个好的开始方式是记录发生了什么。您可以通过重构if语句来验证操作的结果是否成功:
<div id="one"><p>One</p></div>
<div id="two"><p>Two</p></div>
<div id="three"><p>Three</p></div>
<div id="four"><p>Four</p></div>
查看状态信息以获取更多信息:
if (places.getStatus().isSuccess() && places.getCount() > 0)
然后只需检查LogCat以获取状态消息。这不是一个真正的答案,但它肯定会给你一些关于如何继续的线索。