把 "格子衫" 改造得更时尚 | Kotlin & Jetpack 最佳实践技巧

Plaid 是格子图案的意思,也是一款在 2015 年开源的 Material Design 样例应用。它通过 API 调用聚合了 Dribbble、Designer News 和 Product Hunt 三个网站的内容数据,并通过丰富的 UI 交互体验呈现给用户。 

重构 Plaid 的目标不仅是修复内容源 API 接口的失效问题,更重要的是应用最新的 Android Jetpack、Kotlin 语言特性和 Android 应用架构指南,因此 Plaid 2.0 将不仅仅是 Material Design 的示例应用,同时还将是一个使用了 Kotlin 的符合 Android 应用架构指南的示例应用。 

本文将为大家分享和总结 Android 团队工程师们在重写 Plaid 应用时的实践经验,前面部分将着重分享应用的分层设计,后面部分是具体使用 Kotlin 实现的视频,扩展阅读部分提供了更多 Plaid 重构以及 Kotlin 相关知识的文章。

Plaid 1.0

起初,我们定位 Plaid 将是一款 Material Design 样例应用,我们希望通过它展示 Material Design 的可以为交互体验带来的改进。

△ 最初的 Plaid 被设计为 Material Design 样例应用  
△ Plaid 里实现的图标动画效果
△ Plaid 里构建了我们称之为 Reflow Text 的动画效果  
△ 让相同文字在位置转换的时候有一个酷炫的「走位」


△ Plaid 在 Designer News 模块实现了评论嵌套显示和当前评论突出显示的功能

2017 年,这些内容源的部分 API 发生了改动: Dribbble 的 Shots API 里不再返回评论的内容,Shot 点赞和用户关注的接口失效。类似这样的 API 改动,也同样出现在了 Designer News 和 Product Hunt 这两个内容源。

不过,我们有失去也有得到: Kotlin 作为 Android 官方的首要支持编程语言这一重大的消息在 17 年 Google I/O 时公布。同年 11 月,Android Jetpack 系列内的架构组件 (Architecture Components) 1.0 版正式发布,用以帮助开发者构建高质量的应用,这份指南包含了移动应用用户体验的说明,常见的架构原则,推荐的应用架构说明和最佳实践等。

因此,在决定修复 Plaid 应用 Bug 的同时,我们希望为这个项目加入 Jetpack 架构组件和引入 Kotlin 语言,使其成为一个更 "时尚" 的应用。

重构 Plaid 应用

Plaid 重构的目标 / 要求有以下几个:

   解决因内容源的 API 失效而导致的功能缺失问题

   构建模块化、可扩展的应用架构,规范依赖引用和注入

   引入和使用 Kotlin 重构现有功能

随着 Android 平台不断的改进以及 Kotlin 在全球开发者社区的迅速流行,达到这个目标变得更容易了。比如可以通过使用 Android App Bundles 动态增添新的新闻源,使用新的 AndroidX 库,使用 Jetpack,遵循 Android 应用架构指南构建应用等。

我们在应用里使用了 Android App Bundles 的动态模块功能为新的新闻源模块接入提供可能。此外,我们为 Plaid 规划了三层,分别是 Data 层、Domain 层、UI 层,并设计了一些主要的类如下图所示:

接下来我们一层一层的分享一些主要的类和它们的作用:

首先是 Data 层,这一层我们会关注数据的交互和持久化存储,我们设计了 RemoteDataSource 和 LocalDataSource 两个类,其中 RemoteDataSource 将用来与 API 服务交互,构造请求数据,接收响应数据;而 LocalDataSource 则会负责将数据存储在本地,存储的方式可以通过数据库,或者 SharedPreferences。

为了衔接和使用 RemoteDataSource 和 LocalDataSource 这两个类,我们设计了一个名为 Repository 的类,这个类将用于获取和存储数据,也可以把数据缓存到内存里。

如果 Repository 类只依赖于一个数据源,每次都从后端获取数据而不做任何临时存储的话,在用户离开当前页面重新返回时,应用将必须重新获取数据,即使数据未发生更改也是如此,这将会浪费宝贵的网络带宽,并且可能迫使用户等待页面完成加载。更多关于数据获取的架构设计和推荐,请参考《Jetpack 应用架构指南》。

实际的业务逻辑通常会比较复杂,我们设计了一些小型的轻量级并且可以复用的 UseCase 类,这些类将基于实际的业务逻辑来处理数据,由这些 UseCase 类构成了应用架构的第二层: Domain 层。特别要提到的是,每个 UseCase 类将只负责完成一个单独的任务,比如回复评论等: 

第三层是 UI 层,首先我们设计了一个 ViewModel 类,它的目标将是为界面的显示提供数据,以及根据用户的操作触发不同的响应,它的输出是 LiveData:

在 UI 层使用 Activity 和 XML 显示界面以及将用户的操作转发给 ViewModel。

LiveData 可以很好的跟 Activity 和 Fragment 配合使用,而且与 DataBinding 结合,可以直接将数据与 XML 绑定,所以在 UI 层,这里我们选择使用 LiveData 和 DataBinding。

使用 Kotlin (视频)

Kotlin 语言有诸多特性 (如协程的 suspend 函数、扩展函数和高阶函数等) 可以帮助开发者更好的构建应用。比如,我们在重构 Plaid 应用时具体的利用扩展函数来提高 "when" 表达式的可读性。请参考下面的视频来了解更多有关的技巧和最佳实践:


Kotlin 语言帮助开发者更好的构建应用。_腾讯视频

腾讯视频链接

https://v.qq.com/x/page/q3006tgkwbk.html

Bilibili 视频链接

https://www.bilibili.com/video/av70762038/

扩展阅读

本文仅针对 Plaid 的应用架构和 Kotlin 实现进行了简单描述,更多关于 Plaid 相关文章,包括 Android App Bundles、AndroidX 重构,以及多模块的依赖注入实践等,请参看我们通过掘金翻译计划的社区内容项目发布的文章:

Plaid 的 Android App Bundle 重构实践:

https://juejin.im/post/5c7fba65e51d45284d2f0107 

将 Plaid 迁移到 AndroidX :

https://juejin.im/post/5cb567cc6fb9a068a17c9728 

Plaid 应用中使用 Dagger 管理依赖和在多模块里的依赖注入 :

https://juejin.im/post/5cee7ae6f265da1b855c38db 

Plaid 2.0 应用在 GitHub 开源,查看更详细的代码实现,或参与本开源项目,请查看: https://github.com/android/plaid

关于 Kotlin 的更多知识,可以参考我们之前发布的内容《31 天,从浅到深轻松学习 Kotlin》,或 点击这里 访问 Android 开发者文档网站。

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

推荐阅读更多精彩内容