分享一个我开发的MVVM架构的开源小项目

2,913 阅读7分钟

大家好,今天跟大家分享一个我开发的 MVVM 架构的开源小项目。

话说这个小项目已经提前跟大家预热很久了,也是被不少朋友催了很多次。我之前在公众号里透漏过这个项目能够帮助大家更好地理解 MVVM 架构,当然我也希望确实如此。

虽说这篇文章重点是向大家介绍这个开源小项目的,但是我并不希望就写得如此简单,我准备把它写成一篇干货文章。

一、项目的初衷

一切先从 Jetpack 说起。我在去年年底的时候抽时间研究了下 Google 的 Jetpack,这是一款在 18 年 Google I/O 大会上推出的 Android 开发组件工具集,旨在帮助我们轻松构建更稳定、更健壮、以及更可维护的应用程序。

Jetpack 又引出了好几个相关联的概念,比如说 Architecture Components,MVVM,它们之间是什么关系呢?

这里我先给大家做个普及,Architecture Components 是 Google 在 17 年的 I/O 大会上推出的架构组件工具集,18 年被并入到了 Jetpack 当中,所以严格上来讲,Architecture Components 目前是 Jetpack 的一部分。而 MVVM(Model-View-ViewModel)是一种代码架构模式,被广泛应用在 Android 程序设计领域,类似的架构模式还有 MVP、MVC 等。但是,目前 Google 最为推荐的代码架构模式就是 MVVM,甚至 Jetpack 中的许多组件就是为了便于实现 MVVM 架构的项目而提供的。

也就是说,借助 Jetpack,我们就可以轻松地编写一个 MVVM 架构的项目了,当然前提是你对 Jetpack 已经比较了解。

这里我先给出一张 Jetpack 的全家福:

可以看到,Jetpack 主要分为 4 个部分,基础、架构、行为、界面。你会发现,里面有很多东西都是我们平时经常使用的,像 AppCompat、通知、权限,甚至连 Fragment 都属于 Jetpack。由此可见,Jetpack 并不全是些新东西,只要是能够帮助开发者更好更方便地构建应用程序的组件,Google 都将其归纳入了 Jetpack。

在 Jetpack 这么多组件当中,其中最需要我们关注的就是架构组件了,这些是帮助我们编写出 MVVM 架构程序的核心。像数据绑定、Lifecycles、LiveData、Room、ViewModel 等,都可以说是构建一个 MVVM 架构程序的重要组成部分。当然,上述组件中你并不一定要全部使用,而是可以选着使用,视自己项目的实际情况选取那些最合适的组件即可。

本篇文章我并不会带着大家一起学习 Jetpack 中的诸多组件,只是做个简单科普而已。可能有不少朋友还从来没接触过 Jetpack,这里我贴出几个我当时用来学习的链接,大家可以适当参考一下。

ViewModels : A Simple Example
medium.com/androiddeve…

Basic Example of LiveData and ViewModel
medium.com/@taman.neup…

Handling Lifecycles with Lifecycle-Aware Components
developer.android.com/topic/libra…

Android lifecycle-aware components codelab
codelabs.developers.google.com/codelabs/an…

Build an App with Architecture Components
codelabs.developers.google.com/codelabs/bu…

上述链接中包括了 Google 工程师的博客、Android 的官方文档、以及两个 Google Codelabs 项目,当然我还参考了很多其他的资料。但是当我把这些资料都看完,并且将 Codelabs 项目也跟着教程一步步敲出来了之后,我始终还是觉得不能融会贯通,对 Jetpack 以及 MVVM 架构的把控程度都还不够。我就意识到少了点什么,看来我得自己从头写一个 MVVM 的项目才行,这样才能做到对各个知识点和坑点无死角地扫描,这也是我决定做这样一个小开源项目的初衷。

二、项目的标准

确定了要做的事情之后,接下来就是思考要做一个什么样的开源项目了,有以下几个标准吧:

  1. 要用 Jetpack 组件来实现。
  2. 项目要越小越好,突出 MVVM 主题。
  3. 作为开源项目,代码要尽可能易懂,有学习价值。

其实这对我来说并不难想,列出了以上几个标准之后,我一下子就想到了要做一个什么开源项目——酷欧天气 Jetpack 版。酷欧天气作为《第一行代码》中的经典学习项目,已经被无数小伙伴练习过,大家都是非常熟悉的。而开源这样一个项目的 Jetpack 版,主体功能都是保持和之前的酷欧天气版本一致的,只是里面的代码实现全部替换成了 Jetpack 组件和 MVVM 架构,这样更加可以突显出我们要关注的主题,另外也可以方便对比 MVVM 架构和非 MVVM 架构项目之间的区别。

这里我先给出一张酷欧天气 Jetpack 版的架构设计图,这张图是模仿 Google Codelabs 的 Sunshine 项目画出来的,上面也已经给出了这个项目的链接。拥有良好架构设计的项目都是可以用简洁清晰的架构图表示出来的,而一个杂乱无章没有架构设计的项目则很难用架构图表示出来。

上述架构图可能一开始看你会找不着重点,其实这张架构图非常清晰,我来带大家解读一下。

三、项目的架构解读

首先我们通过这张架构图成功将程序分为了若干层。

绿色部分表示的是 UI 控制层,这部分就是我们平时写的 Activity 和 Fragment。

蓝色部分表示的是 ViewModel 层,ViewModel 用于持有和 UI 元素相关的数据,以保证这些数据在屏幕旋转时不会丢失,以及负责和仓库之间进行通讯。

黄色部分表示的是仓库层,仓库层要做的工作是自主判断接口请求的数据应该是从数据库中读取还是从网络中获取,并将数据返回给调用方。如果是从网络中获取的话还要将这些数据存入到数据库当中,以避免下次重复从网络中获取。简而言之,仓库的工作就是在本地和网络数据之间做一个分配和调度的工作,调用方不管你的数据是从何而来的,我只是要从你仓库这里获取数据而已,而仓库则要自主分配如何更好更快地将数据提供给调用方。

接下来灰色部分表示是的本地数据层,实现方式并不固定,我使用了 LitePal 来进行数据持久化处理,你也可以使用别的框架(这里我没有使用官方的 Room 还是因为 Room 真的不太好用)。

最后红色部分表示的是网络数据层,这里使用了 Retrofit 从 web 服务接口获取数据。

借助这张架构图,我想会在很大程度上便于大家理解酷欧天气 Jetpack 版这个开源项目,而如果你自己编写的项目也能尝试画出这样一张架构图,那么你的代码结构一定是非常不错的。

另外对于这张架构图我还有必要再解释一下,图中所有的箭头都是单向的,比方说 WeatherActivity 指向了 WeatherViewModel,表示 WeatherActivity 持有 WeatherViewModel 的引用,但是反过来 WeatherViewModel 不能持有 WeatherActivity 的引用。其他的几层也是一样的道理,一个箭头就表示持有一个引用。

还有,引用不能跨层持有,就比方说 UI 控制层不能持有仓库层的引用,每一层的组件都只能和它的相邻层交互。

大概就介绍这么多吧,剩下的就靠大家自己去阅读源码进行学习了,酷欧天气 Jetpack 版的开源地址是:

github.com/guolindev/c…

项目运行截图如下:
             
另外也请大家随手帮我点个 star,多一些鼓励,我也就多一些持续贡献开源的动力。

最后,希望这个项目能够帮助大家更好地学习 Jetpack,更好地学习 MVVM 架构。