问题描述
这是显示泄漏的项目链接:https://github.com/Anton111111/BottomSheetLeak
如果您单击显示 btn 底部工作表对话框将打开。当你关闭底部表leakcanary会显示泄漏:
┬───
│ GC Root: System class
│
...
├─ com.example.anton111111.MainFragment instance
│ Leaking: NO (Fragment#mFragmentManager is not null)
│ ↓ MainFragment.bottomSheet
│ ~~~~~~~~~~~
├─ com.example.anton111111.MyBottomSheetDialog instance
│ Leaking: UNKNowN
│ Retaining 115,8 kB in 1870 objects
│ mContext instance of android.view.ContextThemeWrapper,wrapping activity com.example.anton111111.MainActivity with
│ mDestroyed = false
│ Dialog#mDecor is null
│ ↓ Dialog.mWindow
│ ~~~~~~~
├─ com.android.internal.policy.MiuiPhoneWindow instance
│ Leaking: UNKNowN
│ Retaining 15,5 kB in 293 objects
│ mContext instance of android.view.ContextThemeWrapper,wrapping activity com.example.anton111111.MainActivity with
│ mDestroyed = false
│ Window#mDestroyed is false
│ ↓ PhoneWindow.mDecor
│ ~~~~~~
╰→ com.android.internal.policy.DecorView instance
Leaking: YES (ObjectWatcher was watching this because com.android.internal.policy.DecorView received
View#onDetachedFromWindow() callback)
Retaining 2,7 kB in 48 objects
key = 6926a1af-7a43-4047-9a76-91a099507a62
watchDurationMillis = 12581
retainedDurationMillis = 7575
View not part of a window view hierarchy
View.mAttachInfo is null (view detached)
View.mWindowAttachCount = 1
mContext instance of android.view.ContextThemeWrapper,wrapping activity com.example.anton111111.MainActivity
with mDestroyed = false
I Skipped log. Here is full leakcanary output: https://raw.githubusercontent.com/Anton111111/BottomSheetLeak/master/leakcanary.log
Can i fix it?
解决方法
您在片段中持有对 BottomSheetDialog
的引用,这就是它泄漏的原因。解除后,引用会阻止垃圾收集器对其进行清理。您应该使用静态方法(伴随对象)来创建对话框并在对话框的 onCreateView
中扩展布局。
有关详细信息,请参阅此 blog post。