返回

揭开Jetpack MVVM七宗罪之一:拿Fragment当LifecycleOwner的真面目

Android

Jetpack MVVM 的七宗罪:不要拿 Fragment 当 LifecycleOwner

导言

Jetpack MVVM 是一种构建 Android 应用程序的强大架构,但开发人员有时会错误地使用它,导致应用程序出现问题。在 Jetpack MVVM 中,视图模型是负责业务逻辑的组件,而视图负责显示数据。视图模型的生命周期与视图的生命周期不同,视图模型的生命周期与 Activity 或 Fragment 的生命周期相关联。本文将探讨 Jetpack MVVM 中一个常见的错误用法,即把 Fragment 当作 LifecycleOwner,并提供更佳的实践。

不要拿 Fragment 当 LifecycleOwner

在某些情况下,开发人员可能会将 Fragment 作为 LifecycleOwner 来使用。这是不正确的,因为 Fragment 的生命周期与视图的生命周期相同,而视图模型的生命周期与 Activity 或 Fragment 的生命周期相关联。把 Fragment 作为 LifecycleOwner 来使用会导致以下问题:

  • 视图模型的生命周期会与视图的生命周期耦合,导致视图模型无法正确地管理其资源。
  • 视图模型可能会在视图销毁后仍然持有对视图的引用,导致内存泄漏。
  • 视图模型可能会在视图销毁后仍然被其他组件引用,导致视图模型无法正确地释放其资源。

最佳实践

在 Jetpack MVVM 中,视图模型的生命周期应该与 Activity 或 Fragment 的生命周期相关联。开发人员可以通过以下方式实现此目的:

  • 使用 ViewModelProviders.of(this) 来获取视图模型。
  • 使用 LiveData 来观察视图模型的数据。
  • 使用 LifecycleOwner.addObserver(this) 来将视图模型注册为生命周期观察者。

通过这种方式,视图模型的生命周期将与 Activity 或 Fragment 的生命周期相关联,从而避免了将 Fragment 作为 LifecycleOwner 来使用所导致的问题。

示例

class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // 使用 LifecycleOwner 观察视图模型的数据
        viewModel.data.observe(viewLifecycleOwner) { data ->
            // 更新 UI
        }
    }
}

结论

将 Fragment 作为 LifecycleOwner 来使用是一种常见的 Jetpack MVVM 错误用法。这种错误用法会导致视图模型的生命周期与视图的生命周期耦合,从而导致各种问题。为了避免这种错误用法,开发人员应该使用 Activity 或 Fragment 的生命周期来管理视图模型的生命周期。

常见问题解答

1. 为什么不能把 Fragment 当作 LifecycleOwner?

因为 Fragment 的生命周期与视图的生命周期相同,而视图模型的生命周期与 Activity 或 Fragment 的生命周期相关联。把 Fragment 当作 LifecycleOwner 会导致视图模型的生命周期与视图的生命周期耦合,从而导致各种问题。

2. 如何正确地管理视图模型的生命周期?

使用 ViewModelProviders.of(this) 来获取视图模型,使用 LiveData 来观察视图模型的数据,并使用 LifecycleOwner.addObserver(this) 将视图模型注册为生命周期观察者。

3. 什么是视图模型?

视图模型是负责业务逻辑的组件,而视图负责显示数据。视图模型的生命周期与 Activity 或 Fragment 的生命周期相关联。

4. 什么是 LifecycleOwner?

LifecycleOwner 是一个对象,它知道自己的生命周期并可以管理其他对象的生命周期。Activity 和 Fragment 都实现了 LifecycleOwner 接口。

5. 什么是 LiveData?

LiveData 是一个可观察的数据类,它可以自动更新视图,当底层数据改变时,视图会被通知。LiveData 可以用来从视图模型中获取数据。