:当getView()为null时,即在onCreateView()之前或onDestroyView()之后,无法访问片段视图的LifecycleOwner

时间:2019-11-07 07:15:10

标签: android android-recyclerview recycler-adapter android-lifecycle

我正在将应用程序中的实时数据用于所有网络呼叫和响应处理。

在一种情况下,我的回收者视图正在将一些数据加载到其视图持有者的onBind中,并且响应正在更新UI。为此,我必须向观察者提供lifecycleOwner

由于回收者视图没有自己的生命周期所有者,因此我通过使用parentFragment.viewlifecycleOwner来使用其父片段,但是以某种方式给出了错误。

当父片段没有实例时,视图持有者如何拥有实例?

viewModel.responseState.observe(parentFragment.viewLifecycleOwner, Observer {
    updateUI(it)
})
  

致命异常:java.lang.IllegalStateException:当getView()为null时,即在onCreateView()之前或onDestroyView()之后,无法访问片段视图的LifecycleOwner

5 个答案:

答案 0 :(得分:4)

getViewLifecycleOwner()文档中,我认为我无法更好地解释:

可以安全访问视图生命周期的第一种方法是onCreateView(LayoutInflater,ViewGroup,Bundle),条件是必须返回非空视图(如果访问视图生命周期,则将抛出IllegalStateException,但不要访问)不会返回非null的视图。

通过调用onDestroyView(),视图生命周期保持有效,此后getView()将返回null,视图生命周期将被销毁,并且此方法将引发IllegalStateException。考虑使用getViewLifecycleOwnerLiveData()或FragmentTransaction.runOnCommit(Runnable)来接收有关Fragment的视图生命周期何时可用的回调。

public LifecycleOwner getViewLifecycleOwner() {
    if (mViewLifecycleOwner == null) {
        throw new IllegalStateException("Can't access the Fragment View's LifecycleOwner when "
                + "getView() is null i.e., before onCreateView() or after onDestroyView()");
    }
    return mViewLifecycleOwner;
}

答案 1 :(得分:0)

作为您的评论,解决方案是确保片段的视图不为null。这发生在我的ViewPager片段中。

答案 2 :(得分:0)

对我来说,解决方案得到了简化。我正在使用单独的观察者-一个用于网络,该网络从主要活动(或仅从任何活动)中使用Lifecycleowner,另一个用于片段视图(模型视图模型)。

答案 3 :(得分:0)

我遇到了同样的问题,我可以用下面的代码修复它,只需检查视图是否为空

     if ( view != null)
       viewModel.responseState.observe(parentFragment.viewLifecycleOwner, Observer {
       updateUI(it) })

答案 4 :(得分:0)

我的解决方案是在 onViewCreated 中编写代码,而不是在 onCreateView 中编写...... 我的问题解决了。