• ViewModel的共享(上)


    1. 什么是ViewModel

    我们先来试着了解一下,为什么叫做“ViewModel”这个名字?(以下是个人的解读)将ViewModel就可以拆成 “View”和“Model”。

    • View:就是我们看到的UI界面。例如常见的实现了 lifecycleOwner 的Fragment、activity、自定义View等等。View应该专注于处理UI界面的展示。
    • Model:就是数据的获取类。例如:网络请求、数据库读取等等。
    • ViewModel:就是介于View和Model这两个之间存在的一个组件,连接着View和Model。负责存储和处理UI界面需要的所有数据。数据来源来自Model,在ViewModel中对数据进行处理,View会监听ViewModel中数据的变化从而进行UI上的响应。所以ViewModel绝不会,也不应该访问视图层次结构(例如视图绑定对象)或存储对 activity 或 fragment 的引用。

    2. ViewModel的生命周期

    ViewModel 对象存在的时间范围是获取 ViewModel 时传递给 ViewModelProvider 的 Lifecycle。ViewModel 将一直留在内存中,直到限定其存在时间范围的 Lifecycle 永久消失:对于 activity,是在 activity 完成时;而对于 fragment,是在 fragment 分离时。(因为 ViewModel 存储在 activity/fragment 中的 ViewModelStore 中)。
    其实可以认为存在的时间范围是从您首次请求 ViewModel 直到 LifecycleOwner 完成并销毁。
    所以在使用ViewModel的时候我们最好是在实现了 LifecycleOwner 的对象上使用,防止出现OOM。
    下面借鉴以下官方的图:
    在这里插入图片描述

    3. 怎么使用ViewModel

    MVVM的出现,MVP也渐渐被MVVM所替代,这里的MVVM就指的是包含ViewModel的。在使用ViewModel的同时,通常也会将 LiveData 搭配使用。

    • LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
    • 当 LifecycleOwner 处于活动状态时,才会通知此观察者有关包装数据的修改。即 状态必须是STARTED 以上的活跃状态,才会收到通知。
    • 当 处于 DESTROYED 状态时,将添加了 Lifecycle 的观察者将被自动删除。LifecycleOwner 可以安全地观察 LiveData 而不必担心泄漏,当它们被销毁时,它们将立即取消订阅。
  • 相关阅读:
    Dockerfile多阶段构建(multi-stage builds)
    83-Java异常:处理机制、案例、自定义异常
    中国剩余定理(crt)和扩展中国剩余定理(excrt)
    LegalQA 数据集 样例数据
    vuedraggable插件在弹框中使用时,遇到了哪些问题
    线程池BUG复现和解决
    【Linux从入门到精通】多线程 | 线程互斥(互斥锁)
    Tuxera NTFS2023Mac读写ntfs磁盘工具
    电大搜题——打开学习之门的最佳选择
    矩阵分析与应用
  • 原文地址:https://blog.csdn.net/coding_sleep/article/details/126091646