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架构模式背后的概念,再加上你已经掌握的基础开发知识,你可以使用这种模式构建一个真正的可维护的应用程序了,还等什么?开始行动吧😎

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容