第一次自定义了BottomSheetDialogFragment的时候。发现了LeakCanary 会在dialog dismiss后报内存泄漏。完了不明所以然的去网上搜寻各种解决方案。当然,各个分析都是一顿操作猛如虎,也确实是分析对了的。但是我就是没办法用他们提供的方案解决掉这个内存泄漏。
每每dismiss的时候都会飘出一个小鸟。具体的内存泄漏日志如下
写一个demo案例如下。
就是一个界面一个按钮。点击后show一个空的dialogFragment,一样报内存泄漏。
com.google.android.material.bottomsheet.BottomSheetDialogFragment instance
Leaking: YES (ObjectWatcher was watching this because com.google.android.material.bottomsheet.
BottomSheetDialogFragment received Fragment#onDestroy() callback and Fragment#mFragmentManager is null)
看日志,告诉我的是dialogFragment 收到了onDestroy的回调了。也就是被销毁,那么gc就应该回收掉该fragment对象。但是呢当前界面还持有该对象的引用造成了内存泄漏。
解决办法:
1、WeakReference
activity持有的dialogFragment对象引用在dismiss后会被gc回收掉,直接解决内存泄漏。
2、既然activity一直持有dialogFragment对象引用,那么我们就直接定义到一个匿名内部内中创建一个一次性的对象来使用。让当前界面不再持有该被回收而还持有引用这种情况。
打完收工。