Androidx片段中的getViewLifeCycleOwner()vs'this'vs this.getActivity()

时间:2019-11-18 07:33:05

标签: android android-fragments android-lifecycle

我们在片段中大量使用了LiveData的observe方法。近期发布的androidx片段sdk导致Android Studio将liveDataObject.observe(this)的实例标记为liveDataObject.observe(getViewLifecycleOwner())不正确。

  

添加了新的Lint检查,以确保在从onCreateView(),onViewCreated()或onActivityCreated()观察LiveData时使用getViewLifecycleOwner()。 (b / 137122478)   https://developer.android.com/jetpack/androidx/releases/fragment

我们担心实施此更改,因为我们不了解getViewLifecycleOwner()的功能与使用this的功能相比,以及它是否会与使用{{1}产生冲突}或this(在片段中设置ViewModel)。

此外,我们使用Android导航组件,并注意到当用户导航到同一活动中的不同片段时,每个片段的this.getActivity()方法被调用,而不是onDestroyView()

以下是我们在onDestroy()中的代码示例

onViewCreated()

稍后,在 vm.getStemLengths().observe(this, stemLengths -> { this.stemLengths = new ArrayList<>(Stream.of(stemLengths).map(stemLength -> new SearchModel(Integer.toString(stemLength.getValue()))).toList()); });

onDestroyView()

同时,根据片段的不同,设置LiveData的ViewModel将使用以下之一进行设置:

 vm.getStemLengths().removeObservers(this);

要在活动中的各个片段之间保留视图模型。

或者:

 vm = new ViewModelProvider(this.getActivity()).get(PrepareVM.class);

如果不需要将VM持久存储在当前片段之外

总而言之,当观察片段vm = new ViewModelProvider(this).get(AprobacionVM.class); 中的LiveData对象与ViewModel模式/导航组件冲突时,会将this更改为getViewLifeCycleOwner()吗?例如,是否可能存在这样一个实例:实时数据更改最终触发了与用户导航远离的同一活动中的上一个片段的观察者?

从getViewLifeCycleOwner的文档看来,进行此更改可能使我们可以删除每个片段的onCreateView()中的removeObservers()调用。那是正确的理解吗?

1 个答案:

答案 0 :(得分:2)

Fragment实现LifecycleOwner,将其创建和销毁事件分别映射到片段的onCreateonDestroy

Fragment.getViewLifecycleOwner()分别将其创建和销毁事件映射到片段的onViewCreatedonDestroyView。准确的序列描述为here

如果要在观察者中使用视图,则需要视图生命周期。否则,当视图层次结构无效时,您可能会获得更新,这可能导致崩溃。

  

从getViewLifeCycleOwner的文档看来,进行此更改可能使我们可以删除每个片段的onDestroyView()中的removeObservers()调用。

正确。