Жизненный цикл привязки данных androidx NullPointerException - PullRequest
0 голосов
/ 28 января 2019

Я не могу найти происхождение этого 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 объектам после того, как фрагмент приостановлен / уничтожен.Я не смог найти никого, кто сталкивался с этой проблемой раньше, и мне довольно трудно понять суть проблемы.

1 Ответ

0 голосов
/ 29 января 2019

Я столкнулся с этой же проблемой сегодня утром и был рад видеть, что я был не единственным.

Я думаю, что решил ее для себя, хотя немного трудно быть уверенным, поскольку вызнать.Для меня это было, когда листание между фрагментами в viewPager, что я иногда получаю ошибку.Я полагаю, что фрагменты были отделены, когда они были за кадром, но все еще вызывались обновления связывания данных.Я подтвердил это, установив для offPerPageLimit viewPager значение 0, и я начал получать ошибку более последовательно:

Мое решение было заменить:

binding.setLifecycleOwner(this);

На:

binding.setLifecycleOwner(getViewLifecycleOwner());

См .: getViewLifecycleOwner

Получите LifecycleOwner, представляющий жизненный цикл представления фрагмента.В большинстве случаев это отражает жизненный цикл самого фрагмента, но в случае отдельных фрагментов жизненный цикл фрагмента может быть значительно более продолжительным, чем жизненный цикл самого представления.

У меня нетЯ снова столкнулся с ошибкой после внесения этого изменения, поэтому, пожалуйста, дайте мне знать, если это решит проблему для вас.Я обновлю свой ответ, если наконец получу ошибку снова, но пока я уверен, что это исправило ее в моем случае.

...