把 "格子衫" 改造得更時尚 | 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 應用架構指南的示例應用。html

本文將爲你們分享和總結 Android 團隊工程師們在重寫 Plaid 應用時的實踐經驗,前面部分將着重分享應用的分層設計,後面部分是具體使用 Kotlin 實現的視頻,擴展閱讀部分提供了更多 Plaid 重構以及 Kotlin 相關知識的文章。android

Plaid 1.0

起初,咱們定位 Plaid 將是一款 Material Design 樣例應用,咱們但願經過它展現 Material Design 的能夠爲交互體驗帶來的改進。git

△ 最初的 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 版正式發佈,用以幫助開發者構建高質量的應用,這份指南包含了移動應用用戶體驗的說明,常見的架構原則,推薦的應用架構說明和最佳實踐等。github

所以,在決定修復 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" 表達式的可讀性。請參考下面的視頻來了解更多有關的技巧和最佳實踐:網絡

擴展閱讀

本文僅針對 Plaid 的應用架構和 Kotlin 實現進行了簡單描述,更多關於 Plaid 相關文章,包括 Android App Bundles、AndroidX 重構,以及多模塊的依賴注入實踐等,請參看咱們經過掘金翻譯計劃的社區內容項目發佈的文章:架構

Plaid 2.0 應用在 GitHub 開源,查看更詳細的代碼實現,或參與本開源項目,請查看: github.com/android/pla…

關於 Kotlin 的更多知識,能夠參考咱們以前發佈的內容《31 天,從淺到深輕鬆學習 Kotlin》,或 點擊這裏 訪問 Android 開發者文檔網站

相關文章
相關標籤/搜索