LeakCanary在我的Java Android应用程序-谷歌地图中检测到漏洞

LeakCanary在我的Java Android应用程序-谷歌地图中检测到漏洞,java,android,memory-leaks,leakcanary,Java,Android,Memory Leaks,Leakcanary,我对这个场景比较陌生,几乎没有编程背景,因此如果我问了一些愚蠢的问题,我会提前道歉。 我正在使用SupportMapFragment显示google地图。我这样做是为了防止onDestroyView()中出现泄漏,但是不知道这是对还是错 @Override protected void onDestroy() { super.onDestroy(); mMap.clear(); mapView.onDestroy(); } 完整代码如下: 这是我退出应用程序时得到的结

我对这个场景比较陌生,几乎没有编程背景,因此如果我问了一些愚蠢的问题,我会提前道歉。 我正在使用SupportMapFragment显示google地图。我这样做是为了防止onDestroyView()中出现泄漏,但是不知道这是对还是错

@Override
protected void onDestroy() {
    super.onDestroy();
    mMap.clear();
    mapView.onDestroy();
}
完整代码如下:

这是我退出应用程序时得到的结果:

  │ GC Root: Local variable in native code
  │
  ├─ com.google.maps.api.android.lib6.gmm6.vector.n instance
  │    Leaking: UNKNOWN
  │    Retaining 1391172 bytes in 9076 objects
  │    Thread name: 'RenderDrive'
  │    ↓ n.e
  │        ~
  ├─ com.google.maps.api.android.lib6.gmm6.vector.p instance
  │    Leaking: UNKNOWN
  │    Retaining 1391005 bytes in 9073 objects
  │    ↓ p.k
  │        ~
  ├─ com.google.maps.api.android.lib6.gmm6.api.ac instance
  │    Leaking: UNKNOWN
  │    Retaining 1390953 bytes in 9072 objects
  │    View not part of a window view hierarchy
  │    View.mAttachInfo is null (view detached)
  │    View.mWindowAttachCount = 1
  │    mContext instance of android.app.Application
  │    ↓ ac.mParent
  │         ~~~~~~~
  ├─ android.widget.FrameLayout instance
  │    Leaking: UNKNOWN
  │    Retaining 405651 bytes in 5497 objects
  │    View not part of a window view hierarchy
  │    View.mAttachInfo is null (view detached)
  │    View.mWindowAttachCount = 1
  │    mContext instance of android.app.Application
  │    ↓ FrameLayout.mParent
  │                  ~~~~~~~
  ├─ com.google.android.gms.maps.MapView instance
  │    Leaking: YES (View.mContext references a destroyed activity)
  │    Retaining 403455 bytes in 5482 objects
  │    View not part of a window view hierarchy
  │    View.mAttachInfo is null (view detached)
  │    View.mID = R.id.mapsView
  │    View.mWindowAttachCount = 1
  │    mContext instance of com.app.trikojis.MainActivity with mDestroyed = true
  │    ↓ MapView.mContext
  ╰→ com.app.trikojis.MainActivity instance
  ​     Leaking: YES (ObjectWatcher was watching this because com.app.trikojis.MainActivity received Activity#onDestroy()
  ​     callback and Activity#mDestroyed is true)
  ​     Retaining 60455 bytes in 956 objects
  ​     key = f3613896-cce8-4aac-a73a-d4a79700c719
  ​     watchDurationMillis = 56451
  ​     retainedDurationMillis = 51448
  ​     mApplication instance of android.app.Application
  ​     mBase instance of androidx.appcompat.view.ContextThemeWrapper, not wrapping known Android context
  
  METADATA
  
  Build.VERSION.SDK_INT: 28
  Build.MANUFACTURER: samsung
  LeakCanary version: 2.5
  App process name: com.app.trikojis
  Stats: LruCache[maxSize=3000,hits=5749,misses=110455,hitRate=4%]
  RandomAccess[bytes=5714581,reads=110455,travel=48839777691,range=35924253,size=41590935]
  Analysis duration: 11845 ms```



   

leaktrace表示MainActivity已被销毁,但由MapView保存在内存中,MapView将该活动作为其上下文

现在,这里真正奇怪的是,MapView是FrameLayout的父级,它的上下文是应用程序,它本身是名为“ac”(模糊名称)的视图的父级,该视图由“RenderDrive”线程实例的字段持有

这肯定是谷歌地图库中的一个bug。你应该在他们的bug追踪器上报告这个问题,也可以随意使用我刚刚发布的这个答案

我不知道到底是什么bug导致了这次泄漏,但您可以通过在活动被销毁时删除MapView的所有子项来修复它

@覆盖
受保护的空onDestroy(){
super.ondestory();
mMap.clear();
mapView.onDestroy();
removeallview();
}

泄漏跟踪表示MainActivity已被销毁,但由MapView保存在内存中,MapView将该活动作为其上下文

现在,这里真正奇怪的是,MapView是FrameLayout的父级,它的上下文是应用程序,它本身是名为“ac”(模糊名称)的视图的父级,该视图由“RenderDrive”线程实例的字段持有

这肯定是谷歌地图库中的一个bug。你应该在他们的bug追踪器上报告这个问题,也可以随意使用我刚刚发布的这个答案

我不知道到底是什么bug导致了这次泄漏,但您可以通过在活动被销毁时删除MapView的所有子项来修复它

@覆盖
受保护的空onDestroy(){
super.ondestory();
mMap.clear();
mapView.onDestroy();
removeallview();
}

我认为没有必要做mapView.onDestroy(),所以试着删除它,或者如果真的有必要,试着在super之前做。onDestroy()我认为没有必要做mapView.onDestroy(),所以试着删除它,或者如果真的有必要,试着在super.onDestroy()之前做这些无用的/错误的答案,持续多年,而真正的答案是坐在这里只有2票?真可惜!为什么谷歌这么多年来都没有解决这个问题!!所有这些无用/错误的答案持续了这么多年,而真正的答案是坐在这里,只有2票?真可惜!为什么谷歌这么多年来都没有解决这个问题!!