Retrofit 2.6.0 ! 更快捷的協(xié)程體驗(yàn) 帚称!

本文鏈接:https://blog.csdn.net/weixin_44946052/article/details/93225439
近日 Retrofit 更新到了 2.6.0 版本,內(nèi)置了對(duì) Kotlin Coroutines 的支持蓬痒,進(jìn)一步簡(jiǎn)化了使用 Retrofit 和協(xié)程來(lái)進(jìn)行網(wǎng)絡(luò)請(qǐng)求的過(guò)程泻骤。其實(shí)縱觀編程語(yǔ)言的發(fā)展歷史,從匯編到 C/C++梧奢,從 Java瞪讼,OC 到 Swift,Kotlin粹断,甚至被納入教材的 Python,都有一個(gè)共同的特點(diǎn)嫡霞。隨著 CPU 性能的越來(lái)越強(qiáng)悍瓶埋,提高生產(chǎn)力似乎都成了現(xiàn)代高級(jí)編程語(yǔ)言的共同目標(biāo)。Kotlin 就是一個(gè)好例子,做同樣的事情养筒,完成同樣的功能曾撤,Java 的確需要更多的代碼,Kotlin 也的確給 Android 開發(fā)提升了效率晕粪。特別是在異步任務(wù)方面挤悉,Kotlin 提供了協(xié)程,而這是 Java 所不具備的巫湘。關(guān)于 Kotlin Coroutines 的介紹装悲,可以閱讀我之前的三篇譯文:

在 Android 上使用協(xié)程(一):Getting The Background
在 Android 上使用協(xié)程(二):Getting started
在 Android 上使用協(xié)程(三) :Real Work

回到正題,本篇主要介紹 Retrofit 2.6.0 版本中協(xié)程的使用方式尚氛,不會(huì)過(guò)多涉及原理诀诊。我以我自己的 wanandroid 應(yīng)用為例進(jìn)行改造,源代碼中 Retrofit 版本是 2.4.0 阅嘶。這個(gè) wanandroid 是基于 Kotlin + 協(xié)程 + LiveData + MVVM 實(shí)現(xiàn)的属瓣,具體架構(gòu)可見(jiàn)我的文章 真香!Kotlin+MVVM+LiveData+協(xié)程 打造 Wanandroid讯柔! 抡蛙,個(gè)人覺(jué)得代碼還是比較清晰的,很適合作為 Kotlin 的 入門項(xiàng)目魂迄。

老版本 Retrofit 的使用
在介紹如何使用 Retrofit 2.6.0 之前粗截,我們先來(lái)看一下老版本的 Retrofit 是如何基于 Kotlin Coroutines 工作的,以登錄接口為例极祸。

首先在 WanService 接口中作如下定義:

@POST("/user/login")
fun login(@Field("username") userName: String, 
          @Field("password") passWord: String): Deferred<WanResponse<User>>

注意這里使用的返回值是 Deferred<T> 對(duì)象慈格,這就意味著使用的時(shí)候要通過(guò) await 來(lái)獲取返回值。那么如何讓 Retrofit 直接返回 Deferred<T> 呢遥金?使用的也是 JakeWharton 的開源庫(kù):

implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'

在構(gòu)建 Client 的時(shí)候添加上這個(gè)適配器:

.addCallAdapterFactory(CoroutineCallAdapterFactory.invoke())

然后給 LoginRepository 提供一個(gè) suspend 方法:

suspend fun login(userName: String, passWord: String): WanResponse<User> {
    return apiCall { WanRetrofitClient.service.login(userName, passWord).await() }
}

這里使用 await 來(lái)獲取 Deferred<T> 的返回值浴捆。

最后在 LoginViewModel 中是這樣調(diào)用的:

fun login(userName: String, passWord: String) {
    launch {
        val response = withContext(Dispatchers.IO) { repository.login(userName, passWord) }
        executeResponse(response, { mLoginUser.value = response.data }, { errMsg.value = response.errorMsg })
    }
}

launch() 方法做了簡(jiǎn)單的封裝,感興趣的同學(xué)可以到源碼中看一下稿械。

以上就是在 Retrofit 2.4.0 中使用協(xié)程的基本方式了选泻,其實(shí)代碼也很簡(jiǎn)潔。而 Retrofit 2.6.0 讓這一切更加簡(jiǎn)單美莫!就讓我們一睹為快吧页眯!

Retrofit 2.6.0 中協(xié)程的使用
Talking is cheap, show me the code ! 還是上面的登錄接口,基于 Retrofit 2.6.0 來(lái)改造一下厢呵。

第一步窝撵,修改 Retrofit 依賴。

implementation 'com.squareup.retrofit2:retrofit:2.6.0'

第二步襟铭,修改 WanService 中接口的定義碌奉。

@POST("/user/login")
suspend fun login(@Field("username") userName: String, 
                  @Field("password") passWord: String): WanResponse<User>

看到區(qū)別了嗎短曾?首先,不再返回 Deferred<T> 對(duì)象赐劣,而是直接返回我們需要的 WanResponse 對(duì)象嫉拐。其次,使用了 suspend 來(lái)修改方法魁兼,標(biāo)記這是掛起函數(shù)婉徘。

第三步,修改 LoginRepository 中方法定義咐汞。

suspend fun login(userName: String, passWord: String): WanResponse<User> {
    return apiCall { WanRetrofitClient.service.login(userName, passWord) }
}

與之前的版本相比盖呼,這里不需要調(diào)用 await 方法了。其實(shí)并不是不調(diào)用了碉考,而是 Retrofit 幫助我們自動(dòng)調(diào)用了塌计。

最后別忘了去除之前添加的 kotlin-coroutines-adapter,因?yàn)槲覀儾辉傩枰斯し祷?Deferred<T> 對(duì)象侯谁,也不再需要手動(dòng)調(diào)用 await 了锌仅。

//.addCallAdapterFactory(CoroutineCallAdapterFactory.invoke())

至此,基于 Retrofit 2.6.0 版本的改造就已經(jīng)完成了墙贱。我的 Wanandroid 項(xiàng)目已經(jīng)完成全部修改热芹,具體修改內(nèi)容可見(jiàn) commit。

總結(jié)
隨著 Kotlin 成為 Android 開發(fā)的首選語(yǔ)言惨撇,越來(lái)越多的新特性都將在 Kotlin 上優(yōu)先實(shí)現(xiàn)伊脓。協(xié)程作為 Kotlin 的異步利器,很值得我們學(xué)習(xí)魁衙。如果你還沒(méi)有入手报腔,那么,從我的 Wanandroid 開始吧 剖淀!
————————————————
版權(quán)聲明:本文為CSDN博主「秉心說(shuō)纯蛾。∽莞簦」的原創(chuàng)文章翻诉,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明捌刮。
原文鏈接:https://blog.csdn.net/weixin_44946052/article/details/93225439

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碰煌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绅作,更是在濱河造成了極大的恐慌芦圾,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俄认,死亡現(xiàn)場(chǎng)離奇詭異个少,居然都是意外死亡碍脏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門稍算,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人役拴,你說(shuō)我怎么就攤上這事糊探。” “怎么了河闰?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵科平,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我姜性,道長(zhǎng)瞪慧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任部念,我火速辦了婚禮弃酌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘儡炼。我一直安慰自己妓湘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布乌询。 她就那樣靜靜地躺著榜贴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妹田。 梳的紋絲不亂的頭發(fā)上唬党,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音鬼佣,去河邊找鬼驶拱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沮趣,可吹牛的內(nèi)容都是我干的屯烦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼房铭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驻龟!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缸匪,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤翁狐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后凌蔬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體露懒,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闯冷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懈词。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛇耀。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坎弯,靈堂內(nèi)的尸體忽然破棺而出纺涤,到底是詐尸還是另有隱情,我是刑警寧澤抠忘,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布撩炊,位于F島的核電站,受9級(jí)特大地震影響崎脉,放射性物質(zhì)發(fā)生泄漏拧咳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一囚灼、第九天 我趴在偏房一處隱蔽的房頂上張望骆膝。 院中可真熱鬧,春花似錦啦撮、人聲如沸谭网。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)愉择。三九已至,卻和暖如春织中,著一層夾襖步出監(jiān)牢的瞬間锥涕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工狭吼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留层坠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓刁笙,卻偏偏與公主長(zhǎng)得像破花,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疲吸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容