Observable $ OnPropertyChangedCallback正在泄漏片段

问题描述

我正在使用导航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 (将#修改为@)