Android 为什么GoogleMap.animateCamera()在onGlobalLayout()之后崩溃?

Android 为什么GoogleMap.animateCamera()在onGlobalLayout()之后崩溃?,android,google-maps-android-api-2,Android,Google Maps Android Api 2,我遇到了一个嵌入新的GoogleMapsAPI中的SuportMapFragment的片段的问题。当我的片段被创建时,它在AsyncTask中获取一些数据,从onResume方法开始。当这种情况发生时,MapFragment仍在屏幕外,而是显示一个进度条 当AsyncTask完成时,我向mapView的onGlobalLayout事件注册。然后我显示片段,这将导致地图视图被显示和布局onGlobalLayout被触发,动画开始 这在相当长的一段时间内运行良好,直到我开始优化数据收集AsyncTa

我遇到了一个嵌入新的GoogleMapsAPI中的SuportMapFragment的片段的问题。当我的片段被创建时,它在
AsyncTask
中获取一些数据,从
onResume
方法开始。当这种情况发生时,MapFragment仍在屏幕外,而是显示一个进度条

AsyncTask
完成时,我向mapView的
onGlobalLayout
事件注册。然后我显示片段,这将导致地图视图被显示和布局
onGlobalLayout
被触发,动画开始

这在相当长的一段时间内运行良好,直到我开始优化数据收集
AsyncTask
中的操作,以便几乎在瞬间完成。现在,应用程序在启动时经常会崩溃,更多的时候是在发布时而不是调试时,这就是为什么我认为我正在处理一个我不知道的赛车情况

例外情况如下:

映射大小不应为0。很可能地图视图尚未出现布局

非常感谢您的任何见解

仅供参考:这是导致崩溃的代码:

// Hide status UI
this.progressBar.setVisibility(View.INVISIBLE);
this.statusTextView.setVisibility(View.INVISIBLE);

// Update state
this.uraDataDownloadFinished = true;

// Schedule map translation to occur when layout is complete
final View mapView = this.mapFragment.getView();
if (mapView.getViewTreeObserver().isAlive())
{
    mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener()
    {
        @SuppressWarnings("deprecation")
        @SuppressLint("NewApi") // We check which build version we are using.
        @Override
        public void onGlobalLayout()
        {
            Log.d(TAG, "onGlobalLayout()");
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
            {
              mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
            else
            {
              mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }

            // here we crash
            this.map.animateCamera(
                    CameraUpdateFactory.newLatLngBounds(
                            LatLngBounds.builder()
                                .include(topLeft)
                                .include(topRight)
                                .include(bottomLeft)
                                .include(bottomRight)
                                .build(),
                            0),
                    durationMs,
                    null);
        }
   });
}

// Show map (which will eventually trigger onGlobalLayout)
this.getFragmentManager().beginTransaction().show(this.mapFragment).commit();
this.mapFragment.getMap().setOnCameraChangeListener(this);
//隐藏状态用户界面
this.progressBar.setVisibility(View.INVISIBLE);
this.statusTextView.setVisibility(View.INVISIBLE);
//更新状态
this.uraDataDownloadFinished=true;
//计划在布局完成时进行地图转换
最终视图mapView=this.mapFragment.getView();
如果(mapView.getViewTreeObserver().isAlive())
{
mapView.getViewTreeObserver().addOnGlobalLayoutListener(新OnGlobalLayoutListener())
{
@抑制警告(“弃用”)
@SuppressLint(“NewApi”)//我们检查正在使用的构建版本。
@凌驾
公共图书馆
{
Log.d(标记“onGlobalLayout()”);
if(Build.VERSION.SDK\u INT

非常感谢

我不确定,但由于您使用的是AsyncTask,可能是您试图在地图进行布局之前获取地图边界


您可以看到,建议使用
newLatLngBounds(边界、宽度、高度、填充)

试试这个,它适合我:

map.setOnCameraChangeListener(new OnCameraChangeListener() {

    @Override
    public void onCameraChange(CameraPosition arg0) {
        // Move camera.
        map.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 10));
        // Remove listener to prevent position reset on camera move.
        map.setOnCameraChangeListener(null);
    }
});

谢谢,行得通。因为地图完全填满了一个布局容器,所以我可以使用它的尺寸。然而,我的问题仍然存在。因为我在等待
onGlobalLayout()
,所以我不应该遇到这个问题,是吗?不,我不这么认为,您必须等到地图经过布局。我明白了,所以
MapView
的布局并不是地图布局的指示。只是出于好奇:有没有办法倾听地图的布局过程,还是不可能?我在API上看不到任何明显的东西。我从未使用过它,但您可以在下面找到它