在 onActivityCreated 或 onViewCreated 中观察 LiveData 是否安全
Is it safe to observe LiveData inside onActivityCreated or onViewCreated
在onActivityCreated
或onViewCreated
里面观察LiveData
是否安全,不是给LifecycleOwner
添加了新的观察者,多个观察者会在LifecycleOwner
中活跃吗一样Fragment
?
例如,当我们从 Fragment A
导航到 Fragment B
然后导航回 Fragment A
时, onActivityCreated
\ onViewCreated
in Fragment A
将被调用 twice 和 viewModel.liveData.observe()
将被调用 twice.
这取决于您要将哪个 Lifecycle
对象传递给您的 Observer
。
假设您在 Fragment's
onCreate
方法中订阅 Observer
。这解决了 observe
被调用两次的问题,但是如果用户按下后退按钮,Fragment A
的 onCreate
将不会被调用,因此没有 Observer
订阅。或者甚至在某些情况下,您的观察方法可以在您的片段现在处于活动状态时被调用并导致崩溃。
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 -> {} });
}
因为通过这种方式您可以观察 LiveData
绑定到 Fragment
视图的生命周期。
所以在 onCreateView
或 onViewCreated
和 onActivityCreated
中观察 LiveData
是安全的,因为文档在 onCreateView
之后调用它:Link(但在 API 级别 28 中已弃用,不再鼓励使用)。
P.S。 Google IO 2018 中关于此问题的非常有用的演讲:Youtube Link
在onActivityCreated
或onViewCreated
里面观察LiveData
是否安全,不是给LifecycleOwner
添加了新的观察者,多个观察者会在LifecycleOwner
中活跃吗一样Fragment
?
例如,当我们从 Fragment A
导航到 Fragment B
然后导航回 Fragment A
时, onActivityCreated
\ onViewCreated
in Fragment A
将被调用 twice 和 viewModel.liveData.observe()
将被调用 twice.
这取决于您要将哪个 Lifecycle
对象传递给您的 Observer
。
假设您在 Fragment's
onCreate
方法中订阅 Observer
。这解决了 observe
被调用两次的问题,但是如果用户按下后退按钮,Fragment A
的 onCreate
将不会被调用,因此没有 Observer
订阅。或者甚至在某些情况下,您的观察方法可以在您的片段现在处于活动状态时被调用并导致崩溃。
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 -> {} });
}
因为通过这种方式您可以观察 LiveData
绑定到 Fragment
视图的生命周期。
所以在 onCreateView
或 onViewCreated
和 onActivityCreated
中观察 LiveData
是安全的,因为文档在 onCreateView
之后调用它:Link(但在 API 级别 28 中已弃用,不再鼓励使用)。
P.S。 Google IO 2018 中关于此问题的非常有用的演讲:Youtube Link