講真的,Airbnb 於開源界,真是不可忽視、貢獻巨大的存在。截止目前,其在 GitHub 網站已經開源 165 個專案,包括大名鼎鼎的移動端跨平臺動畫解決方案 Lottie 倉庫。
近日,Airbnb 公司的 GitHub 主頁又新添一員:MvRx 。
介紹 MvRx 之前,不妨看看這個專案誕生的背景。注意:為了表述上的方便,後文使用第一人稱代表 Airbnb 公司。
引入
隨著旅遊業的興盛,Airbnb 正以前所未有的速度向前發展,越來越多的人使用 Airbnb 產品開始旅行。僅這一年,我們就釋出過 Airbnb Plus 版本,同時還有無數的其他專案,迫不及待地想要和外界分享。在 Android 方面,近乎天文數字般的商業增長使得我們開發人員非常繁忙。我們的 app 端,要做的事情比以往任何時候都要多。過去的一年,我們新增了 286 個頁面,並且沒有減慢步伐的跡象。為了能夠活得更輕鬆一些,我們開始尋找一些防止重複性工作的模式,來幫助我們專注於迭代產品本身。簡介
今天,我們已經做好準備,分享我們的 Android 架構:MvRx(發音為 “mavericks”)。MvRx 誕生於我們一次又一次地解決相同問題的認知beijingxia,使我們不再專注於開發產品。在 Android 端,存在無數的小工作需要工程師去做或考慮,來保證 app 的高品質。譬如:
一遍接一遍的建立含有 toolbar,RecyclerView,和 footer 的佈局檔案;與 Android 生命週期糾纏不清;在正確儲存 view 狀態和業務邏輯;諸如網路和資料庫呼叫的非同步請求所帶來的 onSuccess 和 onFailure 回撥處理;MvRx 使所有這些變得更加簡單。我們開始著手做這件事時,只有一個目標,那就是更簡單、更快和更有趣地開發一款高品質的產品。原本開源這個框架並不是我們的目的,然而隨著 MvRx 的漸漸成形,我們知道必須要這麼做了。我們不僅希望與外界分享,而且我們還希望 MvRx 可以應用於 Airbnb 以外的我們自己的專案,因為它可以從業餘愛好專案擴充套件到擁有 70 名工程師和近百萬行程式碼的應用程式。
實踐
MvRx 建立在 architecture components、RxJava、Epoxy 的基礎上,使用 Kotlin 語言開發的,並且只有 Kotlin 這一個版本。圍繞 Kotlin 語言進行設計使我們能夠構建出一個比使用Java 語言實現更清晰的 API。
就像這樣:
data class HelloWorldState(val title: String = "Hello World") : MvRxStateclass HelloWorldViewModel(initialState: HelloWorldState) : MvRxViewModel<HelloWorldState>(initialState) { fun getMoreExcited() = setState { copy(title = "$title!") }}class HelloWorldFragment : BaseFragment() { private val viewModel by fragmentViewModel(HelloWorldViewModel::class) override fun EpoxyController.buildModels() = withState(viewModel) { state -> header { title(state.title) } basicRow { onClick { viewModel.getMoreExcited() } } }}
在這個簡單的 Fragment 中,只有 18 行程式碼,我們有一個ViewModel,其範圍限定為 Fragment,但將在配置更改中保留,以及頁面的預設佈局和可測試狀態。當狀態改變時,頁面將自動更新,並且只有實際更改的特定部分將被更新到RecyclerView 中。而且,你看到的所有這些程式碼都在後臺執行緒中執行,因為 MvRx 可以無縫地處理執行緒。
MvRx at Airbnb
在短短的幾個月內,MvRx 已經從一個試點階段轉變為我們編寫近所有新頁面的標準方式,開發人員對它非常喜愛。在最新的調查中,93% 的接受調查的工程師(n = 14)給出了8/10 或更高的評價。此外,MvRx 的採用率也是驚人的。試點階段的增長非常穩定,但是當我們在 7 月份開放給所有團隊時,使用率持續攀升。最近短短几個月內,我們已經使用 MvRx 構建出超過 110 個頁面,並且很快就被納為從簡單靜態功能到我們 app 中一些最複雜功能的任何頁面的首選方式開始使用
以上便是來自 Airbnb 工程師對 MvRx 新的架構解決方案的介紹。你有躍躍欲試的衝動嗎?
文章不易,如果大家喜歡這篇文章,或者對你有幫助希望大家多多,點贊,轉發,關注 哦。文章會持續更新的。絕對乾貨!!!