gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:34:16 26 4
gpt4 key购买 nike

我似乎无法找到此 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com