返回

揭秘 ViewModel 生命周期伴随:打造更健壮的 MVVM 应用程序

Android

ViewModel 生命周期:跟随 View 生命周期的奥秘

什么是 ViewModel 生命周期?

在 MVVM(模型-视图-视图模型)架构中,ViewModel 充当 View 和 Model 之间的桥梁。ViewModel 的生命周期与引用它的 Activity 或 Fragment 息息相关,当 View 发生状态变化时,ViewModel 也会相应地更新其生命周期状态。

ViewModel 生命周期如何实现?

ViewModel 生命周期伴随机制的实现主要依靠两个关键机制:

  • 构造函数监听器: 在 ViewModel 的构造函数中,可以添加一个监听器,该监听器在 ViewModel 实例化时执行,并注册一个生命周期观察器。
  • 生命周期观察器: ViewModel 可以注册生命周期观察器,当 View 的生命周期状态发生变化时,这些观察器会收到通知并更新 ViewModel 的生命周期状态。

ViewModel 生命周期状态

ViewModel 的生命周期状态与 View 的生命周期状态一一对应,主要包括:

  • CREATED: ViewModel 已被创建。
  • INITIALIZED: ViewModel 已被初始化。
  • ON_RESUME: ViewModel 已可见并准备好与用户交互。
  • ON_PAUSE: ViewModel 已暂停与用户交互。
  • ON_STOP: ViewModel 已停止与用户交互。
  • ON_DESTROY: ViewModel 已被销毁。

ViewModel 生命周期管理的好处

ViewModel 生命周期伴随机制带来诸多好处:

  • 解除耦合: ViewModel 的生命周期与 View 的生命周期耦合,简化了开发过程,提高了可维护性。
  • 生命周期管理自动化: ViewModel 自动管理自己的生命周期,无需手动实现。
  • 资源释放: 当 View 被销毁时,ViewModel 也会自动销毁,释放其持有的资源。

注意事项

使用 ViewModel 生命周期伴随机制时,需要考虑以下注意事项:

  • 构造函数监听器只会在 ViewModel 实例化时调用一次。
  • 生命周期观察器只会在 View 生命周期状态发生变化时调用,不会在 ViewModel 生命周期状态发生变化时调用。
  • ViewModel 的生命周期状态与 Activity 或 Fragment 的生命周期状态不同。

代码示例

// ViewModel 类
class MyViewModel : ViewModel() {

    // 构造函数监听器
    init {
        // 注册生命周期观察器
        lifecycle.addObserver(MyLifecycleObserver())
    }

    // 生命周期观察器
    class MyLifecycleObserver : LifecycleObserver {

        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        fun onResume() {
            // 更新 ViewModel 的生命周期状态
            lifecycleState = Lifecycle.State.RESUMED
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        fun onDestroy() {
            // 更新 ViewModel 的生命周期状态
            lifecycleState = Lifecycle.State.DESTROYED
        }
    }
}

常见问题解答

  1. 为什么需要 ViewModel 生命周期伴随机制?

    为了确保 ViewModel 的生命周期与引用它的 View 的生命周期同步,实现数据的持久性和状态的恢复。

  2. 什么时候应该使用 ViewModel 生命周期伴随机制?

    当需要将数据与界面分离,实现跨越 Activity 或 Fragment 界限的数据共享时。

  3. 构造函数监听器和生命周期观察器有什么区别?

    构造函数监听器只会在 ViewModel 实例化时调用一次,而生命周期观察器会在 View 生命周期状态发生变化时调用。

  4. ViewModel 的生命周期状态是否与 Activity 或 Fragment 的生命周期状态相同?

    否,ViewModel 的生命周期状态与 View 的生命周期状态对应,与 Activity 或 Fragment 的生命周期状态不同。

  5. 如何处理 ViewModel 中的资源释放?

    ViewModel 在销毁时会自动释放其持有的资源,无需手动实现资源清理。