问题描述
我正在使用导航androidx库和数据绑定/可观察字段的方法。
我运行了LeakCanary,看到它报告了一个片段泄漏。通过查看跟踪,Observable$OnPropertyChangedCallback
中的观察者似乎持有对该片段的引用并将其泄漏,但是我有意删除了onDestroyView中的观察者,我不确定为什么它仍会泄漏。
D/LeakCanary: ┬───
D/LeakCanary: │ GC Root: System class
D/LeakCanary: │
D/LeakCanary: ├─ leakcanary.internal.InternalLeakCanary class
D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking and a class is never leaking)
D/LeakCanary: │ ↓ static InternalLeakCanary.resumedActivity
D/LeakCanary: ├─ com.ui.view.MainActivity instance
D/LeakCanary: │ Leaking: NO (Activity#mDestroyed is false)
D/LeakCanary: │ ↓ MainActivity.mviewmodelStore
D/LeakCanary: │ ~~~~~~~~~~~~~~~
D/LeakCanary: ├─ androidx.lifecycle.viewmodelStore instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ viewmodelStore.mMap
D/LeakCanary: │ ~~~~
D/LeakCanary: ├─ java.util.HashMap instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ HashMap.table
D/LeakCanary: │ ~~~~~
D/LeakCanary: ├─ java.util.HashMap$HashMapEntry[] array
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ HashMap$HashMapEntry[].[2]
D/LeakCanary: │ ~~~
D/LeakCanary: ├─ java.util.HashMap$HashMapEntry instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ HashMap$HashMapEntry.value
D/LeakCanary: │ ~~~~~
D/LeakCanary: ├─ com.ui.mainmenu.viewmodel.MainMenuviewmodel instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ MainMenuviewmodel.menuCategoryList
D/LeakCanary: │ ~~~~~~~~~~~~~~~~
D/LeakCanary: ├─ androidx.databinding.ObservableArrayList instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ ObservableArrayList.elementData
D/LeakCanary: │ ~~~~~~~~~~~
D/LeakCanary: ├─ java.lang.Object[] array
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ Object[].[0]
D/LeakCanary: │ ~~~
D/LeakCanary: ├─ com.datasource.networking.models.MenuItem instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ MenuItem.children
D/LeakCanary: │ ~~~~~~~~
D/LeakCanary: ├─ java.util.ArrayList instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ ArrayList.elementData
D/LeakCanary: │ ~~~~~~~~~~~
D/LeakCanary: ├─ java.lang.Object[] array
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ Object[].[0]
D/LeakCanary: │ ~~~
D/LeakCanary: ├─ com.datasource.networking.models.MenuItem instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ MenuItem.children
D/LeakCanary: │ ~~~~~~~~
D/LeakCanary: ├─ java.util.ArrayList instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ ArrayList.elementData
D/LeakCanary: │ ~~~~~~~~~~~
D/LeakCanary: ├─ java.lang.Object[] array
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ Object[].[0]
D/LeakCanary: │ ~~~
D/LeakCanary: ├─ com.datasource.networking.models.MenuItem instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ MenuItem.totalPrice
D/LeakCanary: │ ~~~~~~~~~~
D/LeakCanary: ├─ androidx.databinding.ObservableDouble instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ ObservableDouble.mCallbacks
D/LeakCanary: │ ~~~~~~~~~~
D/LeakCanary: ├─ androidx.databinding.PropertyChangeRegistry instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ PropertyChangeRegistry.mCallbacks
D/LeakCanary: │ ~~~~~~~~~~
D/LeakCanary: ├─ java.util.ArrayList instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ ArrayList.elementData
D/LeakCanary: │ ~~~~~~~~~~~
D/LeakCanary: ├─ java.lang.Object[] array
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ ↓ Object[].[0]
D/LeakCanary: │ ~~~
D/LeakCanary: ├─ com.ui.menuitem.view.MenuItemFragment$4 instance
D/LeakCanary: │ Leaking: UNKNowN
D/LeakCanary: │ Anonymous subclass of androidx.databinding.Observable$OnPropertyChangedCallback
D/LeakCanary: │ ↓ MenuItemFragment$4.this$0
D/LeakCanary: │ ~~~~~~
D/LeakCanary: ╰→ com.ui.menuitem.view.MenuItemFragment instance
D/LeakCanary: Leaking: YES (ObjectWatcher was watching this because com.ui.menuitem.view.MenuItemFragment received Fragment#onDestroy() callback and Fragment#mFragmentManager is null)
D/LeakCanary: key = d33d4906-ee23-417d-9af6-edef3b5e1aa6
D/LeakCanary: watchDurationMillis = 19014
D/LeakCanary: retainedDurationMillis = 14013
D/LeakCanary: ====================================
所以这里的观察对象是MenuItem.totalPrice
,这是我添加观察者并将其删除的地方。
itemPriceObserver?.let { viewmodel.menuItem?.totalPrice?.addOnPropertyChangedCallback(it) } //done in OnViewCreated
override fun onDestroyView() {
itemPriceObserver?.let { viewmodel.menuItem?.totalPrice?.removeOnPropertyChangedCallback(it) }
itemPriceObserver = null
mBinding = null
super.onDestroyView()
}
因此,在代码中没有其他地方可以向该totalPrice变量添加观察者。绑定引用了它,但我也确保将其设置为null。
感谢任何关于其为何显示为泄漏的想法!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)