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

标签 android android-livedata

onActivityCreatedonViewCreated 中观察 LiveData 是否安全,是不是在 LifecycleOwner 和多个观察者将在同一个 Fragment 中处于 Activity 状态? 例如,当我们从 Fragment A 导航到 Fragment B 然后导航回 Fragment A 时,onActivityCreated\Fragment A 中的 >onViewCreated 将被调用两次 并且 viewModel.liveData.observe() 将被调用两次.

最佳答案

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

假设您在 Fragment 的 onCreate 方法中订阅了您的Observer。这解决了 observe 调用两次的问题,但是如果用户按下后退按钮,Fragment AonCreate 将不会被调用,所以 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

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

附言Google IO 2018 中关于此问题的非常有用的演讲:Youtube Link

关于android - 在 onActivityCreated 或 onViewCreated 中观察 LiveData 是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65426428/

相关文章:

java - 如何在 Android 中使用 cordova 创建一个基本的应用程序类

android - 在 fragment 和 Activity 之间更新 ViewModel

android - 无法解析 : androidx. 生命周期 :lifecycle-extensions-ktx:2. 0.0-alpha1

android - 如何在使用 Livedata 时使用 Filter SearchView for RecyclerView?

android - 从服务更新LiveData

java - Android Studio自动删除txt文件中的多余空格

android - 双面 ViewRenderable

java - 添加项目后 ListView 不会滚动到底部

android - DDMS - 无法为 Android Studio 上的调试器绑定(bind)到本地 8600

android - LiveData setValue 在 doOnComplete android RXJava 之后不起作用