Android:ViewModel.无法调用观察者方法

mur*_*urt 10 android android-lifecycle android-fragments android-viewmodel

我正在使用新的拱门.来自谷歌的组件.

我有活动登录/注册管理片段,感谢 FragmentTransaction

Activity->RegisterFragment (with ViewPager) -> RegistrationSteps (adapter)

在RegisterFragment里面我有ViewPager.我希望里面的所有页面ViewPager都使用相同的ViewModel.

这些都是注册步骤(RegistrationStepFragment),其采用母公司RegistrationFragment LifecycleOwner该范围的视图模型到它-我只是想视图模型先限定这个父片段.

RegistrationFragment.class来自

public interface FragmentViewPagerListener<T extends LifecycleFragment> {
    void nextPage();
    T getLifecycleFragment();
}
Run Code Online (Sandbox Code Playgroud)

RegistartionSteps(页面)来自

public abstract class RegisterStepFragment extends LifecycleFragment {
    protected FragmentViewPagerListener mListener;
    protected RegisterViewModel mViewModel;

    public void setListener(FragmentViewPagerListener fragmentViewPagerListener) {
        this.mListener = fragmentViewPagerListener;
    }

    protected abstract void observeViewModel();

    @Override
    public void onCreated(@Nullable Bundle savedInstanceState) {
        super.onCreated(savedInstanceState);
        mViewModel = ViewModelProviders.of(mListener.getLifecycleFragment()).get(RegisterViewModel.class);
        observeViewModel();
    }

    protected abstract boolean validateData();
}
Run Code Online (Sandbox Code Playgroud)

一切顺利,直到我达到3页,我想向后移动(到第二页)然后抛出异常mViewPager.setCurrentItem(1)(第2页:索引:1)

*java.lang.RuntimeException: Failed to call observer method
                                                                      at android.arch.lifecycle.ReflectiveGenericLifecycleObserver.invokeCallback(ReflectiveGenericLifecycleObserver.java:79)
                                                                      at android.arch.lifecycle.ReflectiveGenericLifecycleObserver.invokeMethodsForEvent(ReflectiveGenericLifecycleObserver.java:53)
                                                                      at android.arch.lifecycle.ReflectiveGenericLifecycleObserver.invokeCallbacks(ReflectiveGenericLifecycleObserver.java:61)
                                                                      at android.arch.lifecycle.ReflectiveGenericLifecycleObserver.onStateChanged(ReflectiveGenericLifecycleObserver.java:45)
                                                                      at android.arch.lifecycle.LifecycleRegistry$ObserverWithState.sync(LifecycleRegistry.java:209)
                                                                      at android.arch.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:102)
                                                                      at android.arch.lifecycle.Li*fecycleDispatcher.dispatchIfLifecycleOwner(LifecycleDispatcher.java:150)
Run Code Online (Sandbox Code Playgroud)

编辑

好吧,我发现当移动到上一页时,Fragment被重新处理并mViewModel.observable()接收了先前的SUCCESS消息并导致viewpager向前移动,这导致销毁刚创建的片段导致错误的原因.

解决方案是创建仅在调用post时发出值的SingleEventLiveData(如果在附加观察者之前值已更改,则不通知观察者)

我把它标记为关闭