[getViewLifeCycleOwner()vs'this'vs this.getActivity()in Androidx Fragments

问题描述 投票:1回答:1

我们在片段中大量使用了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的功能相比如何,以及在设置时是否会与thisthis.getActivity()的使用产生冲突片段中的ViewModel。

另外,我们使用Android导航组件,并注意到当用户导航到同一活动中的不同片段时,每个片段的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()

 vm.getStemLengths().removeObservers(this);

同时,根据片段的不同,使用以下其中一种设置容纳LiveData的ViewModel:

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

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

或:

vm = new ViewModelProvider(this).get(AprobacionVM.class);

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

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

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

android android-fragments android-lifecycle
1个回答
0
投票

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

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

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

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

正确。

© www.soinside.com 2019 - 2024. All rights reserved.