本文鏈接: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