Android - 尝试使用mGeoDataClient.getPlaceById(id)从任务获取PlaceBufferResponse,但失败

问题描述 投票:1回答:1

我试图使用Android工作室在Android中使用谷歌的GeoDataClient来获取地方的信息。具体来说,我已经设置了一个OnPoiClicklistener,所以当点击一个兴趣点时,会显示一个标记,并显示一个InfoWindow来显示详细信息。为了获得细节,我使用了GeoDataClient的getPlaceById(id)方法。如下所示:

Task<PlaceBufferResponse> placeBufferResponseTask = mGeoDataClient.getPlaceById(mPlaceId);
placeBufferResponseTask.addOnCompleteListener(new OnCompleteListener<PlaceBufferResponse>() {
    @Override
    public void onComplete(@NonNull Task<PlaceBufferResponse> task) {
        try {
            PlaceBufferResponse bufferResponse = task.getResult();
            final Place resultPlace = bufferResponse.get(0);

            placeName.setText(resultPlace.getName());
            placeType.setText(resultPlace.getPlaceTypes().get(0));
            placeAddress.setText(resultPlace.getAddress());


            bufferResponse.release();
            } catch (RuntimeException e) {
                Log.e(TAG, "Place query did not complete.", e);
            }
        }

但是,我总是得到一个错误,logcat如下所示:

12-16 10:31:22.735 7218-7218 / com.justinlee.whichpay E / MapsActivity:放置查询未完成。 com.google.android.gms.tasks.RuntimeExecutionException:com.google.android.gms.common.api.ApiException:13:com的com.google.android.gms.tasks.zzn.getResult(未知来源)错误。 justinlee.whichpay.MapsActivity $ 5.onComplete(MapsActivity.java:363)位于android.os.Handler.handleCallback(Handler.java:751)的com.google.android.gms.tasks.zzf.run(未知来源)位于android.app.Looper.loop(Looper.java:154)的.os.Handler.dispatchMessage(Handler.java:95)位于java.lang.reflect的android.app.ActivityThread.main(ActivityThread.java:6119)。 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)的com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)中的Method.invoke(Native Method)引起: com.google.android.gms.common.api.ApiException:13:com.google.android.gms.com上的错误来自com.google.android.gms.common.internal的com.google.android.gms.common.internal.zzb.zzy(未知来源)。 com.google中com.google.android.gms.common.internal.zzbl.zzr(未知来源)的zzbk.zzz(未知来源) com.google.android.gms.location上com.google.android.gms.common.api.internal.zzs.setResult(未知来源)的.android.gms.common.api.internal.zzs.zzc(未知来源) .places.zzm.zzar(未知来源)位于android.os.Binder.execTransact(Binder.java:565)的com.google.android.gms.location.places.internal.zzx.onTransact(未知来源)

问题似乎发生在粗体线上,参考了

PlaceBufferResponse bufferResponse = task.getResult();

从代码。有人可以帮忙吗?非常感谢!

android google-maps google-maps-android-api-2
1个回答
2
投票

您正在使用以下语句从后台线程修改UI:

placeName.setText(resultPlace.getName());
placeType.setText(resultPlace.getPlaceTypes().get(0));
placeAddress.setText(resultPlace.getAddress());

如果要这样做,则需要使用处理程序将修改操作排入UI线程,完整代码如下所示:

placeBufferResponseTask.addOnCompleteListener(new OnCompleteListener<PlaceBufferResponse>() {
        @Override
        public void onComplete(@NonNull Task<PlaceBufferResponse> task) {
            try {
                PlaceBufferResponse bufferResponse = task.getResult();
                final Place resultPlace = bufferResponse.get(0);

                Handler mainHandler = new Handler(Looper.getMainLooper());

                Runnable myRunnable = new Runnable() {
                    @Override
                    public void run() {
                        placeName.setText(resultPlace.getName());
                        placeType.setText(resultPlace.getPlaceTypes().get(0));
                        placeAddress.setText(resultPlace.getAddress());
                    }
                };
                mainHandler.post(myRunnable);

                bufferResponse.release();
            } catch (RuntimeException e) {
                Log.e(TAG, "Place query did not complete.", e);
            }

    }

或者你可以使用runOnUiThread的方法activity

© www.soinside.com 2019 - 2024. All rights reserved.