androidx数据绑定生命周期NullPointerException



我似乎找不到这个DataBindingNullPointerException的来源。当使用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对象是为了内存而被清除的,然后由于某种原因再次被访问。

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

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

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

我的解决方案是更换:

binding.setLifecycleOwner(this);

带有:

binding.setLifecycleOwner(getViewLifecycleOwner());

请参阅:getViewLifecycleOwner

获取表示片段视图生命周期的LifecycleOwner。在大多数情况下,这反映了片段自身的生命周期,但在分离片段的情况下,片段的生命周期可能比视图本身的生命周期长得多。

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

相关内容

最新更新