Androidx 片段中的 getViewLifeCycleOwner() 与“this”与 this.getActivity()

use*_*114 14 android android-lifecycle android-fragments

我们observe在片段中大量使用了 LiveData 的方法。最近发布的 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()using的功能相比如何this,以及它是否会导致使用thisthis.getActivity()在 Fragment 中设置 ViewModel 时发生冲突。

此外,我们使用 Android Navigation 组件并注意到当用户导航到同一个 Activity 中的不同片段时,每个片段的onDestroyView()方法都会被调用,但不会onDestroy()

这是我们的代码示例 onViewCreated()

 vm.getStemLengths().observe(this, stemLengths -> {
        this.stemLengths = new ArrayList<>(Stream.of(stemLengths).map(stemLength ->
                new SearchModel(Integer.toString(stemLength.getValue()))).toList());
  });
Run Code Online (Sandbox Code Playgroud)

后来,在 onDestroyView()

 vm.getStemLengths().removeObservers(this);
Run Code Online (Sandbox Code Playgroud)

同时,根据片段,包含 LiveData 的 ViewModel 设置为以下之一:

 vm = new ViewModelProvider(this.getActivity()).get(PrepareVM.class);
Run Code Online (Sandbox Code Playgroud)

跨活动中的片段保留视图模型。

或者:

vm = new ViewModelProvider(this).get(AprobacionVM.class);
Run Code Online (Sandbox Code Playgroud)

如果 VM 不需要在当前片段之外持久化

总而言之,当观察片段中的 LiveData 对象与 ViewModel 模式/导航组件冲突时,是否会更改this为?例如,是否有一个实例,其中 livedata 更改最终会触发来自用户导航离开的同一活动中的前一个片段的观察者?getViewLifeCycleOwner()onCreateView()

从 getViewLifeCycleOwner 的文档看来,进行此更改可能允许我们删除removeObservers()每个片段的onDestroyView(). 这是正确的理解吗?

Eug*_*nec 16

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

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

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

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

正确的。