Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在onActivityCreated或onViewCreated中观察LiveData是否安全_Android_Android Livedata - Fatal编程技术网

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方法,它将再次添加观察者。