最近在學習 Google 官方的 GithubBrowserSample
項目時,發現 Yigit Boyar 已經在項目裏寫好了一個 Adapter,用來鏈接 Retrofit
與 LiveData
。可是這種作法一直沒有獲得 Retrofit 項目的官方承認 ,時間點在 2017年左右,理由以下:java
- JakeWharton 認爲把 Http 請求包裝成 LiveData 包裝很奇怪
- 當時 LiveData 剛被提出,各類 API 還不穩定
- Retrofit 的擴展機制給了開發者很大的空間去自定義各類集成方式,官方不適合去寫死一些東西
隨着 android architecture components
的日趨完善,愈來愈多的人開始轉向使用 LiveData
,進而享受到了 MVVM
模式的優秀之處。考慮到當時的時間點是 2017 年,隨着以後 JakeWharton 本身也加入了 Google ,而且android architecture components
也早已發佈正式版本,再加上 Google 官方的 Demo 裏已經出現了這種寫法,我以爲是時候嘗試一下了。android
我把官方 Demo 裏的代碼抽出了一個庫,集成以後能夠很方便地將 Retrofit
與 LiveData
結合使用。git
github.com/shawnlinboy…github
implementation 'me.linshen.retrofit2:adapter-livedata:1.0.0'
複製代碼
Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(LiveDataCallAdapterFactory())
.build()
.create(GithubService::class.java)
.getUser("shawnlinboy").observe(this,
Observer { response ->
when (response) {
is ApiSuccessResponse -> {
//success response
}
else -> {
//failed response
}
}
})
複製代碼
目前使用 Retrofit
與 LiveData
結合最大的「問題」就在於,LiveData
自己是對數據類的包裝,或者一個 Observable
,沒有 Callback
的概念,所以須要一個 ApiResponse 來承載一下,好把 Body
放進去,所以在用起來最外層始終會是 ApiResponse
。編程
其實坦白講,在挪完這個庫、寫完 Demo 以後,我以爲這種方法比與 RxJava
的結合真的簡單太多了。儘管我依舊不否認 RxJava
是一個很是優秀的庫,而且我如今手上的項目裏也還有不少地方須要依賴 RxJava
來幫我調度,但我始終以爲 RxJava
對新手是在是太不友好了,主要是上手成本過高:一來你的編程思惟須要向響應式
方向轉變一下,二來RxJava
超多的運算符也確實讓我團隊裏的不少小夥伴喝了一壺,常常用錯,有些甚至是上線後才發現原來用的這個運算符有問題,應該換另一個。api
我會在接下來的一些項目裏儘量採用Retrofit
與 LiveData
結合的方式,看會不會有一些卡殼的場景。若是你們有更好的寫法或者想法,也歡迎提出,歡迎 PR。學習