當 Retrofit 趕上 LiveData

最近在學習 Google 官方的 GithubBrowserSample項目時,發現 Yigit Boyar 已經在項目裏寫好了一個 Adapter,用來鏈接 RetrofitLiveData。可是這種作法一直沒有獲得 Retrofit 項目的官方承認 ,時間點在 2017年左右,理由以下:java

  1. JakeWharton 認爲把 Http 請求包裝成 LiveData 包裝很奇怪
  2. 當時 LiveData 剛被提出,各類 API 還不穩定
  3. Retrofit 的擴展機制給了開發者很大的空間去自定義各類集成方式,官方不適合去寫死一些東西

隨着 android architecture components 的日趨完善,愈來愈多的人開始轉向使用 LiveData,進而享受到了 MVVM 模式的優秀之處。考慮到當時的時間點是 2017 年,隨着以後 JakeWharton 本身也加入了 Google ,而且android architecture components 也早已發佈正式版本,再加上 Google 官方的 Demo 裏已經出現了這種寫法,我以爲是時候嘗試一下了。android

我把官方 Demo 裏的代碼抽出了一個庫,集成以後能夠很方便地將 RetrofitLiveData 結合使用。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
                        }
                    }
                })
複製代碼

說明

目前使用 RetrofitLiveData 結合最大的「問題」就在於,LiveData 自己是對數據類的包裝,或者一個 Observable,沒有 Callback 的概念,所以須要一個 ApiResponse 來承載一下,好把 Body 放進去,所以在用起來最外層始終會是 ApiResponse編程

其實坦白講,在挪完這個庫、寫完 Demo 以後,我以爲這種方法比與 RxJava 的結合真的簡單太多了。儘管我依舊不否認 RxJava是一個很是優秀的庫,而且我如今手上的項目裏也還有不少地方須要依賴 RxJava 來幫我調度,但我始終以爲 RxJava 對新手是在是太不友好了,主要是上手成本過高:一來你的編程思惟須要向響應式方向轉變一下,二來RxJava 超多的運算符也確實讓我團隊裏的不少小夥伴喝了一壺,常常用錯,有些甚至是上線後才發現原來用的這個運算符有問題,應該換另一個。api

我會在接下來的一些項目裏儘量採用RetrofitLiveData 結合的方式,看會不會有一些卡殼的場景。若是你們有更好的寫法或者想法,也歡迎提出,歡迎 PR。學習

相關文章
相關標籤/搜索