我正在将应用程序中的实时数据用于所有网络呼叫和响应处理。
在一种情况下,我的回收者视图正在将一些数据加载到其视图持有者的onBind
中,并且响应正在更新UI。为此,我必须向观察者提供lifecycleOwner
。
由于回收者视图没有自己的生命周期所有者,因此我通过使用parentFragment.viewlifecycleOwner
来使用其父片段,但是以某种方式给出了错误。
当父片段没有实例时,视图持有者如何拥有实例?
viewModel.responseState.observe(parentFragment.viewLifecycleOwner, Observer {
updateUI(it)
})
致命异常:java.lang.IllegalStateException:当getView()为null时,即在onCreateView()之前或onDestroyView()之后,无法访问片段视图的LifecycleOwner
答案 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 中编写...... 我的问题解决了。