在 onActivityCreated
或 onViewCreated
中观察 LiveData
是否安全,是不是在 LifecycleOwner中添加了新的观察者code> 和多个观察者将在同一个
将被调用两次 并且 Fragment
中处于 Activity 状态?
例如,当我们从 Fragment A
导航到 Fragment B
然后导航回 Fragment A
时,onActivityCreated
\Fragment A
中的 >onViewCreatedviewModel.liveData.observe()
将被调用两次.
最佳答案
这取决于您要将哪个Lifecycle
对象传递给您的Observer
。
假设您在 Fragment 的
onCreate
方法中订阅了您的Observer
。这解决了 observe
调用两次的问题,但是如果用户按下后退按钮,Fragment A
的 onCreate
将不会被调用,所以 no 观察者
已订阅。或者甚至在某些情况下,您的观察方法可以在您的 fragment 现在处于 Activity 状态时被调用并导致崩溃。
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
viewModel.liveData.observe(this, Observer { myData -> {} });
}
第二个选项是在 onCreateView()
或 onViewCreated()
中订阅。这两个选项的问题在于,每次重新创建 Fragment A
时都会调用它,最后你会得到不止一个观察者。
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
viewModel.liveData.observe(this, Observer { myData -> {} });
}
那么我们如何解决这些问题呢?答案很简单:使用 viewLifecycleOwner
。
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
viewModel.liveData.observe(viewLifecycleOwner, Observer { myData -> {} });
}
因为通过这种方式,您可以观察绑定(bind)到 Fragment
View 生命周期的 LiveData
。
因此在 onCreateView
或 onViewCreated
和 onActivityCreated
中观察 LiveData
是安全的,因为它被称为在 onCreateView
之后通过文档:Link (但在 API 级别 28 中已弃用,不再鼓励使用)。
附言Google IO 2018 中关于此问题的非常有用的演讲:Youtube Link
关于android - 在 onActivityCreated 或 onViewCreated 中观察 LiveData 是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65426428/