Android 在onActivityCreated或onViewCreated中观察LiveData是否安全
在创建的活动中查看Android 在onActivityCreated或onViewCreated中观察LiveData是否安全,android,android-livedata,Android,Android Livedata,在创建的活动中查看LiveData或在创建的视图中查看LiveData是否安全,它是否会向LifecycleOwner添加新的观察者,并且多个观察者将在同一片段中处于活动状态? 例如,当我们从片段A导航到片段B然后导航回片段A,在片段A中创建的onViewCreated将被调用两次和viewModel.liveData.observe()将被调用两次这取决于您将传递给您的观察者的生命周期对象 public void onViewCreated(View view, Bundle savedIns
LiveData
或在创建的视图中查看LiveData
是否安全,它是否会向LifecycleOwner
添加新的观察者,并且多个观察者将在同一片段中处于活动状态?
例如,当我们从片段A
导航到片段B
然后导航回片段A
,在片段A
中创建的onViewCreated
将被调用两次和viewModel.liveData.observe()
将被调用两次这取决于您将传递给您的观察者的生命周期对象
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
viewModel.liveData.observe(viewLifecycleOwner, Observer { myData -> {} });
}
假设您在Fragment的onCreate
方法中订阅了您的Observer
。这解决了调用两次observe
的问题,但是如果用户按下后退按钮,则不会调用片段A
的onCreate
,因此没有observe
订阅。甚至在某些情况下,当片段现在处于活动状态并导致崩溃时,可以调用您的observe方法
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
viewModel.liveData.observe(this, Observer { myData -> {} });
}
第二个选项是在onCreateView()
或onViewCreated()
中订阅。这两个选项的问题是,每次重新创建片段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 -> {} });
}
因为通过这种方式,您可以观察绑定到Fragment
视图生命周期的LiveData
因此,在onCreateView
或onViewCreated
和onActivityCreated
中观察LiveData
是安全的,因为文档在onCreateView
之后调用了它:(但在API级别28中已弃用,不鼓励再使用)
另外,在Google IO 2018中关于这个问题的一次非常有用的讨论:好的,那么观察使用viewLifecycleOwner
它是安全的,但实际发生了什么?没有添加新的观察者,或者神奇的地方在哪里?因为你的观察者与片段视图的生命周期相关联,一旦视图被破坏,观察者也会被取消订阅。如果在此之后重新创建片段,那么一旦调用onCreateView方法,它将再次添加观察者。