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

Android-尝试使用mGeoDataClient.getPlaceById(id)从任务获取PlaceBufferResponse,但失败,android,google-maps,google-maps-android-api-2,Android,Google Maps,Google Maps Android Api 2,我试着用Android studio在Android中使用谷歌的GeoDataClient获取一个地方的信息。 具体地说,我已经设置了一个OnPoickListener,因此当单击一个关注点时,会显示一个标记,并显示一个信息窗口来显示详细信息。为了获得详细信息,我使用了GeoDataClient的getPlaceById(id)方法。如下图所示: Task<PlaceBufferResponse> placeBufferResponseTask = mGeoDataClient.ge

我试着用Android studio在Android中使用谷歌的GeoDataClient获取一个地方的信息。 具体地说,我已经设置了一个OnPoickListener,因此当单击一个关注点时,会显示一个标记,并显示一个信息窗口来显示详细信息。为了获得详细信息,我使用了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);
            }
        }

从代码中。有人能帮忙吗?非常感谢

您正在使用以下语句从后台线程修改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);
            }

    }
placeBufferResponseTask.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
试一试{
PlaceBufferResponse=task.getResult();
最终位置resultPlace=bufferResponse.get(0);
Handler mainHandler=新处理程序(Looper.getMainLooper());
Runnable myRunnable=新Runnable(){
@凌驾
公开募捐{
placeName.setText(resultPlace.getName());
placeType.setText(resultPlace.getPlaceTypes().get(0));
placeAddress.setText(resultPlace.getAddress());
}
};
mainHandler.post(myRunnable);
bufferResponse.release();
}捕获(运行时异常e){
Log.e(标记“位置查询未完成”,e);
}
}

或者您可以使用的方法
runOnUiThread
of.

非常感谢,我刚刚用您的解决方案使它工作了!
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);
            }

    }