androidx 数据绑定(bind)生命周期 NullPointerException

标签 android nullpointerexception android-livedata android-architecture-navigation

我似乎无法找到此 DataBinding NullPointerException 的来源。当使用 Android Navigation Architecture 导航到 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)

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

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

最佳答案

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

我想我已经自己解决了这个问题,尽管如您所知,这有点难以确定。对我来说,在 viewPager 中的 fragment 之间进行分页时,有时会出现错误。我相信 fragment 在屏幕外时会分离,但仍在调用数据绑定(bind)更新。我通过将 viewPager 的 offscreenPageLimit 设置为 0 来确认这一点,并且我开始更加一致地收到错误。

我的解决方案是替换:

binding.setLifecycleOwner(this);

与:

binding.setLifecycleOwner(getViewLifecycleOwner());

参见:getViewLifecycleOwner

Get a LifecycleOwner that represents the Fragment's View lifecycle. In most cases, this mirrors the lifecycle of the Fragment itself, but in cases of detached Fragments, the lifecycle of the Fragment can be considerably longer than the lifecycle of the View itself.

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

关于androidx 数据绑定(bind)生命周期 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54396955/

相关文章:

android - OnClickListener 和 OnLongClickListener 未在 Launcher 中触发

android - AppAutoStartupPolicy : prevent start service of package com. farsitel.bazaar

c++ - 在大型 C++ 代码库中避免空指针异常

android-fragments - 删除+添加后片段未收到 LiveData 更新

android - 如何在不调用 observe() 的情况下从映射的 LiveData 的 getValue() 获得非空结果?

java - 抽象类和多态问题

android:layout_width 以及布局权重使用

java - 尝试停止重复 J 内部形式时出现空指针异常

java - 数组长度 20 但我希望它在读取最后一个节点后就中断

java - LiveData 对象可以在 XML 中观察吗?