在 onActivityCreated 或 onViewCreated 中观察 LiveData 是否安全

Is it safe to observe LiveData inside onActivityCreated or onViewCreated

onActivityCreatedonViewCreated里面观察LiveData是否安全,不是给LifecycleOwner添加了新的观察者,多个观察者会在LifecycleOwner中活跃吗一样Fragment? 例如,当我们从 Fragment A 导航到 Fragment B 然后导航回 Fragment A 时, onActivityCreated \ onViewCreated in Fragment A 将被调用 twiceviewModel.liveData.observe() 将被调用 twice.

这取决于您要将哪个 Lifecycle 对象传递给您的 Observer

假设您在 Fragment's onCreate 方法中订阅 Observer。这解决了 observe 被调用两次的问题,但是如果用户按下后退按钮,Fragment AonCreate 将不会被调用,因此没有 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 视图的生命周期。

所以在 onCreateViewonViewCreatedonActivityCreated 中观察 LiveData 是安全的,因为文档在 onCreateView 之后调用它:Link(但在 API 级别 28 中已弃用,不再鼓励使用)。

P.S。 Google IO 2018 中关于此问题的非常有用的演讲:Youtube Link