BottomSheetDialog 中的泄漏

问题描述

这是显示泄漏的项目链接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