我在使用新版Google Maps API嵌入SuportMapFragment的Fragment时遇到问题。创建我的片段后,它会在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);
非常感谢!
答案 0 :(得分:5)
我不确定但是你正在使用AsyncTask可能是因为你试图在地图经过布局之前获得地图边界。
您可以看到documentation,建议改为使用newLatLngBounds(boundary, width, height, padding)
。
答案 1 :(得分: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);
}
});