androidx数据绑定生命周期NullPointerException

时间:2019-01-28 07:00:07

标签: 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中的LiveDataViewModel对象是为了节省内存而被清除,然后出于某种原因再次访问。

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

1 个答案:

答案 0 :(得分:23)

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

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

我的解决方案是更换:

binding.setLifecycleOwner(this);

使用:

binding.setLifecycleOwner(getViewLifecycleOwner());

请参阅:getViewLifecycleOwner

  

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

自从我自己进行此更改以来,我再也没有遇到错误,所以请告诉我这是否为您解决了该问题。如果最终还是会再次出现错误,我将更新我的答案,但到目前为止,我相信这已解决了我的情况。