如何解决在 onActivityCreated 或 onViewCreated 中观察 LiveData 是否安全
在 LiveData
或 onActivityCreated
中观察 onViewCreated
是否安全,是不是在 LifecycleOwner
中添加了新的观察者并且多个观察者将在同一个 { {1}}?
例如,当我们从 Fragment
导航到 Fragment A
然后导航回 Fragment B
时,Fragment A
中的 onActivityCreated
\ onViewCreated
将被称为 两次 和 Fragment A
将被调用两次。
解决方法
这取决于您要传递给 Lifecycle
的 Observer
对象。
假设您在 Observer
Fragment's
方法中订阅了 onCreate
。这解决了 observe
被调用两次的问题,但如果用户按下后退按钮,Fragment A
的 onCreate
将不会被调用,因此没有 Observer
订阅。或者甚至在某些情况下,您的观察方法可以在您的 Fragment 现在处于活动状态并导致崩溃时调用。
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,savedInstanceState);
viewModel.liveData.observe(viewLifecycleOwner,Observer { myData -> {} });
}
因为通过这种方式,您可以观察到 LiveData
绑定到 Fragment
视图的生命周期。
因此在 LiveData
或 onCreateView
和 onViewCreated
中观察 onActivityCreated
是安全的,因为它在 onCreateView
之后被文档调用:{{3 }}(但在 API 级别 28 中已弃用,不再鼓励使用)。
附言Google IO 2018 中关于这个问题的一个非常有帮助的演讲:Link
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。