麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

利用Kotlin的方式如何處理網絡異常詳解

2024-07-21 23:03:48
字體:
來源:轉載
供稿:網友

一. 前言

之前的文章 RxJava處理業務異常的幾種方式 曾經介紹過 Retrofit 的異常可以有多種處理方式。

其中,可以使用 RxJava 的錯誤處理操作符,它們是專門用來處理異常的。

隨便例舉兩個操作符:

onErrorReturn 操作符,表示當發生錯誤的時候,發射一個默認值然后結束數據流。所以 Subscriber 看不到異常信息,看到的是正常的數據流結束狀態。

onErrorResumeNext 操作符,表示當錯誤發生的時候,使用另外一個數據流繼續發射數據。在返回的被觀察者中是看不到錯誤信息的。

二. 使用 Kotlin 的特性

這次我結合 Kotlin 擴展函數的特性來嘗試處理異常。

網絡請求返回的 Response 大多是采用如下這種形式:

{ "code":0, "message":"success", "data":{ ... }}

對于客戶端開發而言,我們會封裝一個基類的HttpResponse。

data class HttpResponse<T>( var code: Int = -1, //0: 成功 1: xxx錯誤或過期 2: 業務邏輯錯誤 500:系統內部錯誤 998表示Token無效 var message: String? = null, var data: T? = null) : UnProguard { val isOkStatus: Boolean get() = code == 0}

其中,UnProguard是一個空的接口,主要是方便 App 在混淆的時候保留部分類。

interface UnProguard : Serializable

通常情況下,我們會在 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 的錯誤處理操作符,可以編寫如下的擴展函數:

import com.safframework.utils.RetryWithDelayimport io.reactivex.Maybe/** * * @FileName: *  cn.magicwindow.core.ext.`Maybe+Extension`.kt * @author: Tony Shen * @date: 2018-07-19 17:31 * @version V1.0 <描述當前版本功能> *//** * 嘗試重試 * ?默認有3次重試機會,每次的延遲時間是1000ms */fun <T> Maybe<T>.retryWithDelayMillis(maxRetries: Int=3, retryDelayMillis: Int=1000): Maybe<T> = this.retryWhen(RetryWithDelay(maxRetries,retryDelayMillis))/** * 遇到錯誤時,能夠提前捕獲異常,并發射一個默認的值。 * 后面無須再做異常處理 */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}/** * 遇到錯誤時,能夠提前捕獲異常,并返回一個新的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())

擴展函數 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 還是一個高階函數。它的 action 參數傳遞的是一個函數,專門用于處理異常。每一個網絡請求的異常處理并不會都一樣,可以用該函數來傳遞不同的異常處理。

總結

合理利用 Kotlin 的擴展函數,可以編寫優雅的代碼。而使用高階函數,則可以達到的進一步的抽象。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到kotlin教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲午夜在线 | 免费视频xxxx | www.7777在线| 国产韩国精品一区二区三区久久 | 国色天香综合网 | 国产在线播放一区二区 | 欧美精品激情视频 | 爽爽视频免费看 | 欧美一级毛片特黄黄 | www.99av| 国产精品久久久免费 | 亚洲午夜久久久精品一区二区三区 | 亚洲五码在线观看视频 | 亚洲一区二区免费视频 | 国产精品久久久久久久久久10秀 | 黄色的视频免费观看 | 国产在线精品一区二区三区不卡 | 毛片在线免费 | 国产羞羞视频在线免费观看 | 私库av在线免费观看 | 久久蜜臀一区二区三区av | 日韩中文字幕一区二区三区 | 国产91九色 | 久久精品成人 | 少妇激情视频 | 美女很黄很黄免费的 | 久久久久久久一区 | av在线免费看片 | 国产成年人视频 | 欧美一级免费高清 | 国产91亚洲精品久久久 | 日本最新免费二区三区 | 中日无线码1区 | 久久欧美亚洲另类专区91大神 | 亚洲影视中文字幕 | 欧美精品一区二区视频 | 中文字幕国产亚洲 | 久久精品一区二区三区不卡牛牛 | 国产免费高清在线视频 | 久久草草亚洲蜜桃臀 | 高清av免费 |