「Android 架构」—— MVVM 详解

前言

只要你掌握了基础知识,要想构建一个完整的 Android App 并不难,但是想要写出一个可维护的 App 就是另一回事了,这时候就必须让你自己的代码足够健壮,就需要避免把所有业务逻辑代码都放在 Activity、Fragment,或者是创建多个比较小的只有单一功能的 class。

那么应该怎么做呢?—— 使用 架构模式!MVC、MVP、MVVM、...任何一种都要比没有架构设计的流水式代码好得多,MVVM 是 Android 开发最好的架构选择之一。Google 官方也非常支持和鼓励开发者使用这一架构模式。

本教程将为你讲明白到底什么是 MVVM,虽然我也不喜欢理论,但有时候在实际操作之前先了解它非常重要,所以请务必耐心看完。

Model-View-ViewModel 的意义

关注点分离原则是架构的终极原则,并且每个设计模式都在尽其所能的实现这一点。在 MVVM 中,有 3 个固定部分有助于实现关注点分离:modelsviewsview models。你还可以添加一个 repository ,作为所有数据的单一真实数据来源 —— 后面详细介绍。

image

View

在 MVVM 中, View 不是指 TextViewRecyclerView 这一些控件,而是 app 中负责处理用户界面显示和交互的一个部分,换一种说法就是,View 负责执行一切 Activity 或 Fragment 能做的操作。

这里有一个重要的概念:View 仅仅处理用户的即时交互。什么意思呢?不要把业务逻辑比如数据库操作相关的业务放在 Activities 或 Fragments 中。它只负责显示一些东西在屏幕上(比如从 ViewModels 拿到的一些数据),执行 Android 特定操作并将用户交互事件(点击、滑动等)发送到各自的 ViewModel。

ViewModel

ViewModel 就像 View 和业务逻辑之间的粘合剂,它负责从 Repository 获取数据并提供给 View。

当你查看上面的架构模型图时,你可能想知道 View 如何获取它应该显示的所有数据。如图,箭头仅指向一个方向 -> ViewModel。你可能注意到箭头是单向的,这意味着 ViewModel 没有任何关于哪些 View 正在使用它的线索。虽然这能减少类之间的纠缠,但是 ViewModel 还是需要告诉 View 需要显示哪些数据。

这里的做法就是使 ViewModel 中的适当数据可观察,通过这样做,当数据更新时,我们就无需直接从 ViewModel 去更新 View。View 已经持有了 ViewModel 的引用,因此它可以方便的观察 ViewModel 公开的一些数据。当数据发生变化时,所有观察它的 View 都将收到相应的更改通知(onChange() 被回调)。

image

上述一系列操作可以通过 LiveData 来完成,LiveData 是一个方便的生命周期感知库,用于创建可观察对象。它的一个优点就是当 Activity 或 Fragment 已经销毁时,它就不会自动向其发送通知了,这样就无需我们自己去管理生命周期了。

Model

Model 就是你放置所有特定业务代码的地方,虽然从技术上讲,ViewModel 和 Model 之间存在一个以 Repository 形式存在的中间步骤,你可以将 Repository 中的所有内容视为远离用户界面的一组类。它负责从本地数据库或网络中获取数据并操作应用中的数据。

Repository 具有本地存储和服务器之间的中介这么一个特殊角色,你可以在此检查是否应该在本地缓存远程数据等。Repository 也是 ViewModel 的单一真实数据来源。也就是说,当 ViewModel 想取一些数据,它就从 Repository 拿,然后由 Repository 决定下一步该做什么,对于 ViewModel 来说,数据可以从本地、网络、缓存、…任何地方拿,它并不关心这些 —— 这是 Repository 应该处理的业务逻辑。

MVVM 组件的连接性

View 不仅观察 ViewModel 中的数据,而且 ViewModel 还观察 Repository 中的数据,后者又观察来自本地数据库和远程数据源的数据。

为了全面考虑这一点,你可以通过以下方式考虑 Model,View,ViewModel,Repository 和其他类之间的联系。

遍历层次结构时,上层类直接引用其子级。另一方面,子级不持有其父级引用。如果您愿意,子级只允许通过 LiveData 或任何其他库观察一些数据。

为了便于理解,请看下面的箭头图。我想在开始时为你省去不必要的混乱,这就是为什么那些可观察到的箭头没有出现在介绍 MVVM 的第一个图表中。

image

这里要提到的最后一件重要事情是你应该始终遵守上面的参考树图,例如,不要让你的 ViewModel 绕过 Repository 直接从数据库取数据!一切都有它的目的:使代码模块化,易于维护和阅读等。你今后读代码的时间永远大于写代码,所以代码的可读性要放在第一位,不要懒得去抽离和构建代码,以后的你会感谢当初的自己的。

总结

在这篇文章中,你了解了MVVM架构模式背后的概念。现在您已经掌握了基础知识,快开始使用这种模式构建一个真正的应用程序吧?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券