我似乎找不到此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会为了内存原因而清除LiveData中的ViewModel对象,然后出于某种原因再次对其进行访问。

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

最佳答案

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

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

我的解决方案是更换:

binding.setLifecycleOwner(this);

和:
binding.setLifecycleOwner(getViewLifecycleOwner());

另请:getViewLifecycleOwner



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

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

10-12 00:18