2

MapView在我的应用程序中使用 v2(不是MapFragment),它导致内存泄漏。当我将 Activity 上下文传递给 MapView 构造函数时,就会发生泄漏。如果我将应用程序上下文传递给 MapView 构造函数,内存泄漏就会消失,但是当我滚动它所在的 ScrollView 时,MapView 开始表现不佳。

这是泄漏发生位置的快照:

在此处输入图像描述

中的相关代码MapView为:

public class MapView extends android.widget.FrameLayout {
  private final com.google.android.gms.maps.MapView.b gD;

  static class b extends com.google.android.gms.dynamic.a<com.google.android.gms.maps.MapView.a> {
    private final android.content.Context mContext;
    // Here's the Context MapView is leaking

  }

  static class a implements com.google.android.gms.dynamic.LifecycleDelegate {
    // More stuff in here
  }
}

我已经搞砸MapView了几个星期,现在试图让它在 a 中正常运行ScrollView,但无济于事。我快要放弃了。

此外,snapshot()最近添加的方法不是一个选项,因为我已经尝试过了,它并不能提供可靠的地图快照。我在这里有一个未解决的问题,在这里这里还有另一个相关的未解决问题,所有这些都没有得到回答。

4

4 回答 4

3

可能与danielgomezrico 的回答有关,有一个与我的位置层相关的已确认错误MapView,即泄漏内存。

解决方法是确保GoogleMap.setMyLocationEnabled(false)在地图被破坏之前禁用我的位置。还要确保调用其他地图视图的生命周期方法。

private MapView mMapView;
private GoogleMap mMap;

...

@Override
public void onResume() {
    super.onResume();
    mMapView.onResume();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mMapView.onSaveInstanceState(outState);
}

@Override
public void onPause() {
    super.onPause();
    mMapView.onPause();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mMapView.onLowMemory();
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mMap != null) {
        mMap.setMyLocationEnabled(false);
    }
    mMapView.onDestroy();
}
于 2015-10-01T03:41:25.800 回答
2

几个星期以来,我一直在搞乱 MapView,试图让它在 ScrollView 中正常运行,但无济于事。我快要放弃了。

老实说,这是最好的。MapView 可能永远不会在 ScrollView 中发挥出色。使用这种组合时会出现许多错误。垂直滞后、在 ActionBar 上的 MapView 渲染、垂直滚动根本不起作用等。删除 ScrollView 不仅是首选,而且很可能是必需的。

也就是说,如果您绝对必须这样做,例如由于客户端限制,您有两个选择。

  1. 您可以使用Snapshot&SnapshotReady回调;触发回调时,将 MapView 替换为快照的 ImageView。你失去了交互性,但你也失去了你遇到的问题。(您声称这不起作用或绘制了不完整的位图,尽管我没有遇到这个问题。我不确定您是如何实现它的。)

  2. 编写一个扩展 MapView 的自定义类,覆盖 onTouchEvent 以及对于您需要修复的任何运动事件(可能ACTION_DOWNACTION_UP),手动控制父级(ScrollView)是否可以拦截该操作。this.getParent().requestDisallowInterceptTouchEvent(true|false)根据您的情况使用类似的东西。查看Android 文档以获取有关该方法的更多信息。

我希望这会有所帮助!

于 2013-09-27T23:50:36.337 回答
2

在我正在工作的项目中,我们遇到了类似的问题。我们在 viewholder 中使用 mapView。解决方案是在 mapview 上调用 onPause 然后 onDestroy。之后没有观察到内存泄漏。

于 2015-07-24T09:14:46.247 回答
2

你在片段中使用它吗?可能与此错误有关https://code.google.com/p/android/issues/detail?id=185902

于 2015-09-10T06:30:31.963 回答