从另一个活动返回时,MapFragment 的地图加载滞后

Posted

技术标签:

【中文标题】从另一个活动返回时,MapFragment 的地图加载滞后【英文标题】:Map of MapFragment gets loaded with lag when returning from another activity 【发布时间】:2014-03-15 23:11:20 【问题描述】:

据我所知,MapFragment 的过渡动画存在问题。布局上的所有视图都会立即显示,包括 MapFragment 自己的视图(如缩放按钮)。但是地图本身只有在动画完成后才会加载延迟。

为了说明问题,我做了以下操作:

    我稍微更改了 Google maps android API 示例 中的一项活动。它通过操作项打开一个空白活动。当我点击后退按钮时,地图会被加载,但只有在转换完成后才能加载。 我把过渡效果夸大了一点,让你能更好地看到问题。我将开发者选项中的过渡动画速度设置为5x。即使在 1 倍速度下,这种延迟也令人不安。

观看此视频:http://www.youtube.com/watch?v=12SEotktlXI

您有什么建议可以防止这种延迟吗?为什么所有视图都会立即加载,而地图本身却没有?

测试环境:Nexus 5,android 4.4.2,无根

编辑:使用 MapView 代替 MapFragment 时也会出现此问题。

【问题讨论】:

试过在其他设备上测试吗?我只在 Nexus 5 上注意到它。Galaxy S3 表现出不同的行为... 是的,当然。我在 HTC Desire SV 上试过,没有延迟。我认为那是因为他们不使用过渡动画。当我在 Nexus 5 上关闭过渡动画(设置 > 开发者选项 > 过渡动画)时,延迟也消失了。 所以它与 KitKat 相关......也许是一个错误。 我认为这是一个地图 API 错误,因为所有其他视图都会立即加载,但只有地图不会... 【参考方案1】:

原因:这是因为一旦您设置了活动,地图活动将处于其 onpause() 状态;因此,我假设 android 管理从地图活动中回收了内存。

解决方案: 创建一个静态类并在那里静态声明您的地图,以避免android回收您的地图使用的内存。

例如

//your static class
public class MapData
  public static GoogleMap map;


//your map activity
public class MapActivity extends Activity

  @Override
  protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    if(MapData.map != null)
       MapData.map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
  

【讨论】:

至少要确保 onDestroy 静态变量被清理干净。 很抱歉,这不起作用。我用MapData.map 替换了RetainMapDemoActivity 示例中mMap 的每一次出现,但是当我从虚拟活动回来时地图仍然有滞后...... :(

以上是关于从另一个活动返回时,MapFragment 的地图加载滞后的主要内容,如果未能解决你的问题,请参考以下文章

从另一个活动返回后应用程序未恢复捆绑包

MapFragment 在 getMapAsync(this) 方法中导致 NullPointerException

每当我运行我的片段时,这行代码 mapFragment.setRetainInstance(true);正在崩溃我的应用程序? [关闭]

当我们从另一个活动返回时如何刷新活动的数据?

如何使用 MapFragment(不是 MapView)获取地图的坐标?

ScrollView 中的 MapFragment