gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:56:13 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com