7

我对从新的 Google Maps API 嵌入 SuportMapFragment 的片段有疑问。创建我的片段时,它会AsyncTask在方法的开头获取一些数据onResume。发生这种情况时,MapFragment 保持在屏幕外,而是显示一个进度条。

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

这工作了很长一段时间,直到我开始优化数据收集中的操作AsyncTask以几乎立即完成。现在应用程序在启动时经常会崩溃,在 Release 中比在 Debug 中更常见,这就是为什么我认为我正在处理我不知道的赛车条件。

异常内容如下:

地图大小不应为 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);

非常感谢!

4

2 回答 2

5

我不确定,但是当您使用 AsyncTask 时,您可能正在尝试在地图进行布局之前获取地图边界。

你可以看文档,建议newLatLngBounds(boundary, width, height, padding)改用。

于 2013-01-25T13:14:55.870 回答
3

试试这个,它对我有用:

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);
    }
});
于 2013-04-27T03:37:00.417 回答