从另一个活动返回时,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);正在崩溃我的应用程序? [关闭]