我使用BottomNavigationView并在onNavigationItemSelected中的片段之间切换,因为我想自定义进入和退出动画。
但是我的片段根视图和/或数据绑定变量在此过程中泄漏。
请参阅下面的LeakCanary分析。 clFeedFragmentRoot
是FragmentMainFeed
的根视图,
[feedBinding
是FragmentMainFeedBinding
。
├─ com.google.android.gms.ads.internal.zzq
│ Leaking: NO (zzq↓ is not leaking and a class is never leaking)
│ GC Root: System class
│ ↓ static zzq.zzbmc
├─ com.google.android.gms.ads.internal.zzq
│ Leaking: NO (zzpv↓ is not leaking)
│ ↓ zzq.zzbmk
├─ com.google.android.gms.internal.ads.zzpv
│ Leaking: NO (zzpy↓ is not leaking)
│ ↓ zzpv.zzboy
├─ com.google.android.gms.internal.ads.zzpy
│ Leaking: NO (MainActivity↓ is not leaking)
│ ↓ zzpy.zzzr
├─ com.mypackage.ui.main.MainActivity
│ Leaking: NO (NavHostController↓ is not leaking and Activity#mDestroyed is false)
│ ↓ MainActivity.navController
├─ androidx.navigation.NavHostController
│ Leaking: NO (NavHostFragment↓ is not leaking)
│ ↓ NavHostController.mLifecycleOwner
├─ androidx.navigation.fragment.NavHostFragment
│ Leaking: NO (FragmentManagerImpl↓ is not leaking and Fragment#mFragmentManager is not null)
│ ↓ NavHostFragment.mChildFragmentManager
├─ androidx.fragment.app.FragmentManagerImpl
│ Leaking: NO (HashMap↓ is not leaking)
│ ↓ FragmentManagerImpl.mActive
├─ java.util.HashMap
│ Leaking: NO (HashMap$HashMapEntry[]↓ is not leaking)
│ ↓ HashMap.table
├─ java.util.HashMap$HashMapEntry[]
│ Leaking: NO (HashMap$HashMapEntry↓ is not leaking)
│ ↓ array HashMap$HashMapEntry[].[0]
├─ java.util.HashMap$HashMapEntry
│ Leaking: NO (FragmentStateManager↓ is not leaking)
│ ↓ HashMap$HashMapEntry.value
├─ androidx.fragment.app.FragmentStateManager
│ Leaking: NO (FeedFragment↓ is not leaking)
│ ↓ FragmentStateManager.mFragment
├─ com.mypackage.ui.main.feed.FeedFragment
│ Leaking: NO (Fragment#mFragmentManager is not null)
│ ↓ FeedFragment.feedBinding
│ ~~~~~~~~~~~
├─ com.mypackage.databinding.FragmentMainFeedBindingImpl
│ Leaking: UNKNOWN
│ ↓ FragmentMainFeedBindingImpl.clFeedFragmentRoot
│ ~~~~~~~~~~~~~~~~~~
╰→ androidx.constraintlayout.widget.ConstraintLayout
Leaking: YES (ObjectWatcher was watching this)
mContext instance of com.mypackage.ui.main.MainActivity with mDestroyed = false
View#mParent is null
View#mAttachInfo is null (view detached)
View.mWindowAttachCount = 1
key = 991c9d5b-7065-4c88-9b79-74ad67f5f72d
watchDurationMillis = 77959
retainedDurationMillis = 72956
retainedHeapByteSize=18132), ApplicationLeak(className=androidx.constraintlayout.widget.ConstraintLayout, leakTrace=
我需要帮助来解决泄漏。谢谢
在FeedFragment.onDestroyView()中,您需要将FeedFragment.feedBinding设置为null(绑定包含对视图的引用,因此您需要在onDestroyView()之后放开绑定对象。>