文章目录
- Marvel:一个 MVP 范例级别的 Android 漫威客户端
- 1、 这个仓库里有什么
- 2、 项目结构为什么值得看
- 3、 技术栈长什么样
- 4、 测试怎么处理
- 5、 适合谁翻一翻
Marvel:一个 MVP 范例级别的 Android 漫威客户端
mohsenoid/marvel 在 GitHub 上拿到了 229 Star。
这是一个 Android 客户端,对接 Marvel.com 的角色数据接口。作者 Mohsen Mirhoseini 当年为了 smava GmbH 的技术评估写的,后来当成 MVP 教学样本,配合 Medium 上的五篇连载文章一起发布。
1、 这个仓库里有什么
一个能跑的 Marvel 角色搜索 App,版本号 1.0.1,最后一次更新停在 2018 年 6 月 27 日。
主界面进来就是两个 Fragment:搜索页和缓存页。前者负责按名字找角色,后者列出最近查过的角色。点开角色进到 Character Activity 看详情。
网络异常时不会让界面卡死,弹个 Snackbar 提示用户重连或重试。生命周期和网络行为都按 Android 规矩处理过,不同屏幕尺寸适配也做了。
2、 项目结构为什么值得看
整块代码拆成两个模块:Core-Lib 和 App。
Core-Lib 是纯 Java 写的业务逻辑,跟 Android 完全解耦。App 模块只放 Android UI 相关的东西,负责把 Core-Lib 接到操作系统上。理论上 Core-Lib 可以换个界面层直接跑成命令行或者 Web 应用。
分层走的是 MVP。Antonio Leiva 那套 Android MVP 实践是参考来源。
View 层是 MainActivity 和它内部的两个 Fragment。Fragment 只干一件事:用户操作触发时调一下 presenter 的方法,不写业务逻辑。
Presenter 层是 Search 和 Cache 的两个 Presenter。从后端或数据库取数据,格式化好交给 View,并决定用户交互时该做什么。
Model 层是 Search Interactor,专门负责对接网络服务的数据网关。
3、 技术栈长什么样
2018 年的项目,工具链是 Android Studio 3.1.3、gradle-plugin 4.4、Build Tools 27.1.1、Compile SDK 27、MinSdk 14。
依赖列表里能看到的都是当年 Android 圈的主流选择:
- 网络层:Retrofit 2.1.0 配 OkHttp 3.4.1,Square 出品,Debug 模式下日志挺友好
- 数据库:OrmLite 5.0,一个轻量 ORM。作者注释里提到也能换成 realm 或 DBFlow
- 响应式:RxJava2 2.1.13、RxAndroid 2.0.2、RxBinding 2.1.1,串联各层通信
- 依赖注入:Dagger 2.8,Square 原做、Google 现维护
- 视图绑定:ButterKnife 8.8.1,加上 Google 新出的 DataBinding 库做 Adapter
- 图片加载:Picasso 2.5.2,配合 Palette 支持库从图片里取主色当背景
- 日志:Timber 4.7.0,Jake Wharton 的库,Release 版本里自动不输出 log
- 其他:Firebase 16.0.1 做分析和崩溃上报,作者自己的 AndroidUtils 1.0.11 处理些通用功能
依赖版本统一放在 libraries.gradle 里,避免多模块间的版本冲突。
4、 测试怎么处理
UI 功能和核心类都写了 Test Case,覆盖工具是 jUnit 4.12、Mockito 1.10.19、Robolectric 3.8、Espresso 2.2.2。Dagger 的 mocking 也纳入了测试范围。
持续集成绑了 CircleCI 和 Travis CI 两套,跟 GitHub 仓库联动。
5、 适合谁翻一翻
- 想看一个完整 MVP 落地项目的 Android 开发者
- 研究 Dagger + Retrofit + RxJava 经典组合如何协作的人
- 需要参照成熟项目结构来组织自己代码的工程师
作者在 Medium 上写了五篇连载,从项目结构讲到 Dagger、Retrofit、RxJava,最后落到用 Dagger 配 Espresso 写测试。链接在仓库 README 末尾。想看代码对应那一系列文章的状态,可以切到Yet-another-MVP-article这个 tag。
ADME 末尾。想看代码对应那一系列文章的状态,可以切到Yet-another-MVP-article这个 tag。