【问题标题】:Getting a memory leak after calling lifecycle.addObserver调用lifecycle.addObserver 后出现内存泄漏
【发布时间】:2019-05-09 09:23:51
【问题描述】:

从 Android jetpack arch 组件添加生命周期观察器后,我得到以下泄漏。有什么想法吗?

LeakingInstance(referenceKey=3f842e15-cca3-465a-8345-3a241c8befca, referenceName=, instanceClassName=androidx.navigation.fragment.NavHostFragment, watchDurationMillis=561193, excludedLeak=false, leakTrace=
┬
├─ android.view.inputmethod.InputMethodManager$1
│    Leaking: NO (it's a GC root)
│    Anonymous subclass of com.android.internal.view.IInputMethodClient$Stub
│    ↓ InputMethodManager$1.this$0
│                           ~~~~~~
├─ android.view.inputmethod.InputMethodManager
│    Leaking: UNKNOWN
│    ↓ InputMethodManager.mImeInsetsConsumer
│                         ~~~~~~~~~~~~~~~~~~
├─ android.view.ImeInsetsSourceConsumer
│    Leaking: UNKNOWN
│    ↓ ImeInsetsSourceConsumer.mController
│                              ~~~~~~~~~~~
├─ android.view.InsetsController
│    Leaking: UNKNOWN
│    ↓ InsetsController.mViewRoot
│                       ~~~~~~~~~
├─ android.view.ViewRootImpl
│    Leaking: UNKNOWN
│    ↓ ViewRootImpl.mActivityConfigCallback
│                   ~~~~~~~~~~~~~~~~~~~~~~~
├─ android.app.-$$Lambda$ActivityThread$ActivityClientRecord$HOrG1qglSjSUHSjKBn2rXtX0gGg
│    Leaking: UNKNOWN
│    ↓ -$$Lambda$ActivityThread$ActivityClientRecord$HOrG1qglSjSUHSjKBn2rXtX0gGg.f$0
│                                                                                ~~~
├─ android.app.ActivityThread$ActivityClientRecord
│    Leaking: UNKNOWN
│    ↓ ActivityThread$ActivityClientRecord.activity
│                                          ~~~~~~~~
├─ com.x.x.MainActivity
│    Leaking: YES (Activity#mDestroyed is true)
│    ↓ MainActivity.mFragments
├─ androidx.fragment.app.FragmentController
│    Leaking: YES (MainActivity↑ is leaking)
│    ↓ FragmentController.mHost
├─ androidx.fragment.app.FragmentActivity$HostCallbacks
│    Leaking: YES (FragmentController↑ is leaking)
│    ↓ FragmentActivity$HostCallbacks.mFragmentManager
├─ androidx.fragment.app.FragmentManagerImpl
│    Leaking: YES (FragmentActivity$HostCallbacks↑ is leaking)
│    ↓ FragmentManagerImpl.mPrimaryNav
╰→ androidx.navigation.fragment.NavHostFragment
​     Leaking: YES (Fragment#mFragmentManager is null)
, retainedHeapSize=null)```

【问题讨论】:

  • 展示如何添加观察者
  • 你找到解决办法了吗?

标签: android memory-leaks android-architecture-components leakcanary


【解决方案1】:

这是 Q Beta 上 Android 框架中已知的 IME 泄漏。应在最新版本中识别为已知泄漏:https://github.com/square/leakcanary/blob/master/leakcanary-analyzer/src/main/java/leakcanary/AndroidKnownReference.kt#L312

【讨论】:

    【解决方案2】:

    生命周期观察者有不同的状态,如@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) 或@OnLifecycleEvent(Lifecycle.Event.ON_RESUME),您可以在 onPause 生命周期方法中移除监听器或接收器,然后在 onResume 生命周期方法中再次初始化.

    请使用以下链接了解生命周期感知组件及其生命周期的详细信息

    Lifecycler Observer Documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      相关资源
      最近更新 更多