利用Kotlin的方式如何處理網(wǎng)絡(luò)異常詳解
一. 前言
之前的文章 RxJava處理業(yè)務(wù)異常的幾種方式 曾經(jīng)介紹過 Retrofit 的異??梢杂卸喾N處理方式。
其中,可以使用 RxJava 的錯(cuò)誤處理操作符,它們是專門用來處理異常的。
隨便例舉兩個(gè)操作符:
onErrorReturn 操作符,表示當(dāng)發(fā)生錯(cuò)誤的時(shí)候,發(fā)射一個(gè)默認(rèn)值然后結(jié)束數(shù)據(jù)流。所以 Subscriber 看不到異常信息,看到的是正常的數(shù)據(jù)流結(jié)束狀態(tài)。
onErrorResumeNext 操作符,表示當(dāng)錯(cuò)誤發(fā)生的時(shí)候,使用另外一個(gè)數(shù)據(jù)流繼續(xù)發(fā)射數(shù)據(jù)。在返回的被觀察者中是看不到錯(cuò)誤信息的。
二. 使用 Kotlin 的特性
這次我結(jié)合 Kotlin 擴(kuò)展函數(shù)的特性來嘗試處理異常。
網(wǎng)絡(luò)請(qǐng)求返回的 Response 大多是采用如下這種形式:
{
"code":0,
"message":"success",
"data":{
...
}
}
對(duì)于客戶端開發(fā)而言,我們會(huì)封裝一個(gè)基類的HttpResponse。
data class HttpResponse<T>(
var code: Int = -1, //0: 成功 1: xxx錯(cuò)誤或過期 2: 業(yè)務(wù)邏輯錯(cuò)誤 500:系統(tǒng)內(nèi)部錯(cuò)誤 998表示Token無效
var message: String? = null,
var data: T? = null
) : UnProguard {
val isOkStatus: Boolean
get() = code == 0
}
其中,UnProguard是一個(gè)空的接口,主要是方便 App 在混淆的時(shí)候保留部分類。
interface UnProguard : Serializable
通常情況下,我們會(huì)在 Observer 的 onError 中按照如下的方式處理異常:
viewModel.getHelps(this)
.subscribe({
if (it.isOkStatus) {
multi_status_view.showContent()
adapter.addData(it.data?.list)
} else {
multi_status_view.showError()
}
}, { multi_status_view.showError() })
如果我們利用 RxJava 的錯(cuò)誤處理操作符,可以編寫如下的擴(kuò)展函數(shù):
import com.safframework.utils.RetryWithDelay
import io.reactivex.Maybe
/**
*
* @FileName:
* cn.magicwindow.core.ext.`Maybe+Extension`.kt
* @author: Tony Shen
* @date: 2018-07-19 17:31
* @version V1.0 <描述當(dāng)前版本功能>
*/
/**
* 嘗試重試
* 默認(rèn)有3次重試機(jī)會(huì),每次的延遲時(shí)間是1000ms
*/
fun <T> Maybe<T>.retryWithDelayMillis(maxRetries: Int=3, retryDelayMillis: Int=1000): Maybe<T> =
this.retryWhen(RetryWithDelay(maxRetries,retryDelayMillis))
/**
* 遇到錯(cuò)誤時(shí),能夠提前捕獲異常,并發(fā)射一個(gè)默認(rèn)的值。
* 后面無須再做異常處理
*/
fun <T> Maybe<T>.errorReturn(defValue:T): Maybe<T> = this.onErrorReturn {
it -> it.printStackTrace()
return@onErrorReturn defValue
}
fun <T> Maybe<T>.errorReturn(defValue:T,action: (Throwable) -> Unit): Maybe<T> = this.onErrorReturn {
action.invoke(it)
return@onErrorReturn defValue
}
/**
* 遇到錯(cuò)誤時(shí),能夠提前捕獲異常,并返回一個(gè)新的Maybe
* 后面無須再做異常處理
*/
fun <T> Maybe<T>.errorResumeNext(defValue:T):Maybe<T> = this.onErrorResumeNext(Maybe.just(defValue))
fun <T> Maybe<T>.errorResumeNext():Maybe<T> = this.onErrorResumeNext(Maybe.empty())
擴(kuò)展函數(shù) errorReturn 的使用:
viewModel.getHelps(this)
.errorReturn(HttpResponse()) {
multi_status_view.showError()
}
.subscribe{
if (it.isOkStatus) {
multi_status_view.showContent()
adapter.addData(it.data?.list)
} else {
multi_status_view.showError()
}
}
這樣無須在 onError 中處理異常,而且 errorReturn 還是一個(gè)高階函數(shù)。它的 action 參數(shù)傳遞的是一個(gè)函數(shù),專門用于處理異常。每一個(gè)網(wǎng)絡(luò)請(qǐng)求的異常處理并不會(huì)都一樣,可以用該函數(shù)來傳遞不同的異常處理。
總結(jié)
合理利用 Kotlin 的擴(kuò)展函數(shù),可以編寫優(yōu)雅的代碼。而使用高階函數(shù),則可以達(dá)到的進(jìn)一步的抽象。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android中VideoView音視頻開發(fā)的實(shí)現(xiàn)
VideoView是一個(gè)用于播放視頻的視圖組件,可以方便地在應(yīng)用程序中播放本地或網(wǎng)絡(luò)上的視頻文件,本文主要介紹了Android中VideoView音視頻開發(fā)的實(shí)現(xiàn),具有一定的 參考價(jià)值,感興趣的可以了解一下2025-03-03
Android編程實(shí)現(xiàn)設(shè)置按鈕背景透明與半透明及圖片背景透明的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)設(shè)置按鈕背景透明與半透明及圖片背景透明的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Button及ImageButton的背景屬性設(shè)置技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-12-12
Android progressbar實(shí)現(xiàn)帶底部指示器和文字的進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android progressbar實(shí)現(xiàn)帶底部指示器和文字的進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Android系統(tǒng)狀態(tài)欄定制圖標(biāo)顯示邏輯控制
這篇文章主要為大家介紹了Android系統(tǒng)狀態(tài)欄定制圖標(biāo)顯示邏輯控制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Android使用DrawerLayout實(shí)現(xiàn)側(cè)滑菜單效果
這篇文章主要為大家詳細(xì)介紹了Android使用DrawerLayout實(shí)現(xiàn)側(cè)滑菜單效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android原生項(xiàng)目集成React Native的方法
本篇文章主要介紹了Android原生項(xiàng)目集成React Native的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
Android實(shí)現(xiàn)socket通信統(tǒng)一接口的方法
這篇文章主要介紹了Android實(shí)現(xiàn)socket通信統(tǒng)一接口?,實(shí)現(xiàn)了統(tǒng)一接口之后確實(shí)可以使后續(xù)修改實(shí)現(xiàn)更加方便,程序結(jié)構(gòu)也更加工程化,需要的朋友可以參考下2021-12-12

