androidx数据绑定生命周期NullPointerException

Nei*_*eil 13 android nullpointerexception android-livedata android-architecture-navigation

我似乎找不到这个起源DataBinding NullPointerException。当使用Android Navigation Architecture导航到a Fragment并重复导航时,我最终将获得以下堆栈跟踪

java.lang.NullPointerException: Attempt to invoke direct method 'void androidx.databinding.ViewDataBinding.handleFieldChange(int, java.lang.Object, int)' on a null object reference
        at androidx.databinding.ViewDataBinding.access$800(ViewDataBinding.java:64)
        at androidx.databinding.ViewDataBinding$LiveDataListener.onChanged(ViewDataBinding.java:1592)
        at androidx.lifecycle.LiveData.considerNotify(LiveData.java:113)
        at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:126)
        at androidx.lifecycle.LiveData$ObserverWrapper.activeStateChanged(LiveData.java:424)
        at androidx.lifecycle.LiveData$LifecycleBoundObserver.onStateChanged(LiveData.java:376)
        at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:355)
        at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:293)
        at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:333)
        at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:138)
        at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:124)
        at androidx.fragment.app.Fragment.performStart(Fragment.java:2485)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1494)
        at androidx.fragment.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2646)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2416)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2372)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6938)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Run Code Online (Sandbox Code Playgroud)

看起来它与LiveData异常中所述的生命周期有关。我猜想出于内存原因清除onPause了中的LiveData对象,ViewModel然后出于某种原因再次对其进行了访问。

这似乎是非常随机的,因为它发生在我们所有片段上,但仅当在该特定片段之间连续导航或在应用程序中不同片段之间导航时才如此。LiveData片段暂停/销毁后,我们不会尝试访问对象。我一直找不到以前曾遇到过此问题的人,并且很难找到问题的根源。

小智 28

今天早上我遇到了同样的问题,很高兴看到我不是唯一的一个。

我想我已经为自己解决了这个问题,尽管很难确定。对我来说,就是在viewPager中的片段之间进行分页时,有时会出现错误。我相信这些片段在脱离屏幕时会变得分离,但仍在调用数据绑定更新。我通过将viewPager的offscreenPageLimit设置为0来确认这一点,并且开始更加一致地收到错误。

我的解决方案是更换:

binding.setLifecycleOwner(this);
Run Code Online (Sandbox Code Playgroud)

带有:

binding.setLifecycleOwner(getViewLifecycleOwner());
Run Code Online (Sandbox Code Playgroud)

请参阅:getViewLifecycleOwner

获取一个LifecycleOwner,它代表片段的View生命周期。在大多数情况下,这反映了Fragment本身的生命周期,但是在分离的Fragments情况下,Fragment的生命周期可能比View本身的生命周期长得多。

自从我自己进行更改以来,我再也没有遇到过此错误,因此,如果这为您解决了问题,请告诉我。如果我终于再次收到错误,我将更新我的答案,但是到目前为止,我相信这已经解决了我的问题。

  • 谢谢!因此,我整天迷失了方向,解决方案似乎已解决了这一问题。有趣的是,在搜索中,我实际上在开发人员文档中找到了答案,但是由于我的大脑如此炸裂,我什至没有想到就看了看它。你真的让我很高兴 (2认同)
  • 将生命周期所有者设置为 viewLifeCycleOwner 后,崩溃仍然发生在我身上。当您长时间坐在屏幕上(约 5 分钟)时也会发生这种情况,而不仅仅是在来回导航时 (2认同)
  • @JulioE.RodríguezCabañas看起来已经修复,自昨天升级到3.4.1之后,我还没有遇到任何问题。 (2认同)