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

Pav*_*ley 4 android android-livedata

在orLiveData内部观察是否安全,是否会向 中添加新的观察者并且多个观察者将在同一个中处于活动状态?例如,当我们从 导航到然后导航回时,\ in将被调用两次,并且将被调用两次onActivityCreatedonViewCreatedLifecycleOwnerFragmentFragment AFragment BFragment AonActivityCreatedonViewCreatedFragment AviewModel.liveData.observe()

har*_*ore 7

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

假设您订阅了ObserverinFragment's onCreate方法。这解决了调用两次的问题observe,但如果用户按后退按钮,则Fragment A不会onCreate被调用,因此不会Observer订阅。或者甚至在某些情况下,您的观察方法可以在您的片段现在处于活动状态时被调用并导致崩溃。

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    viewModel.liveData.observe(this, Observer { myData -> {} });
}
Run Code Online (Sandbox Code Playgroud)

您的第二个选择是订阅onCreateView()onViewCreated()。这两个选项的问题在于,每次Fragment A重新创建时都会调用它,最后您将得到多个观察者。

public void onViewCreated(View view, Bundle savedInstanceState){
    super.onViewCreated(view, savedInstanceState);
    viewModel.liveData.observe(this, Observer { myData -> {} });
}
Run Code Online (Sandbox Code Playgroud)

那么我们如何解决这些问题呢?答案很简单:使用viewLifecycleOwner.

public void onViewCreated(View view, Bundle savedInstanceState){
    super.onViewCreated(view, savedInstanceState);
    viewModel.liveData.observe(viewLifecycleOwner, Observer { myData -> {} });
}
Run Code Online (Sandbox Code Playgroud)

因为通过这种方式,您可以观察LiveData绑定到Fragment视图的生命周期。

因此,观察LiveDatainonCreateViewonViewCreatedand in是安全的onActivityCreated,因为它onCreateView在文档中被称为:Link(但在 API 级别 28 中已弃用,并且不再鼓励使用)。

PS 在 Google IO 2018 中关于这个问题的一个非常有用的演讲:Youtube Link