最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Kotlin的方式如何處理網(wǎng)絡(luò)異常詳解

 更新時間:2018年07月25日 08:42:19   作者:Tony沈哲  
這篇文章主要 給大家介紹了關(guān)于利用Kotlin的方式如何處理網(wǎng)絡(luò)異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一. 前言

之前的文章 RxJava處理業(yè)務(wù)異常的幾種方式 曾經(jīng)介紹過 Retrofit 的異常可以有多種處理方式。

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

隨便例舉兩個操作符:

onErrorReturn 操作符,表示當(dāng)發(fā)生錯誤的時候,發(fā)射一個默認(rèn)值然后結(jié)束數(shù)據(jù)流。所以 Subscriber 看不到異常信息,看到的是正常的數(shù)據(jù)流結(jié)束狀態(tài)。

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

二. 使用 Kotlin 的特性

這次我結(jié)合 Kotlin 擴(kuò)展函數(shù)的特性來嘗試處理異常。

網(wǎng)絡(luò)請求返回的 Response 大多是采用如下這種形式:

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

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

data class HttpResponse<T>(
 var code: Int = -1, //0: 成功 1: xxx錯誤或過期 2: 業(yè)務(wù)邏輯錯誤 500:系統(tǒng)內(nèi)部錯誤 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 的錯誤處理操作符,可以編寫如下的擴(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ī)會,每次的延遲時間是1000ms
 */
fun <T> Maybe<T>.retryWithDelayMillis(maxRetries: Int=3, retryDelayMillis: Int=1000): Maybe<T> =
 this.retryWhen(RetryWithDelay(maxRetries,retryDelayMillis))

/**
 * 遇到錯誤時,能夠提前捕獲異常,并發(fā)射一個默認(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
}

/**
 * 遇到錯誤時,能夠提前捕獲異常,并返回一個新的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 還是一個高階函數(shù)。它的 action 參數(shù)傳遞的是一個函數(shù),專門用于處理異常。每一個網(wǎng)絡(luò)請求的異常處理并不會都一樣,可以用該函數(shù)來傳遞不同的異常處理。

總結(jié)

合理利用 Kotlin 的擴(kuò)展函數(shù),可以編寫優(yōu)雅的代碼。而使用高階函數(shù),則可以達(dá)到的進(jìn)一步的抽象。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

最新評論

公主岭市| 盐池县| 安泽县| 丹江口市| 林周县| 佛教| 民乐县| 林芝县| 微博| 夏河县| 嘉峪关市| 浮梁县| 滦平县| 万山特区| 南通市| 定西市| 盐亭县| 海阳市| 祁门县| 黄陵县| 吉水县| 喀喇| 江达县| 临安市| 从化市| 三明市| 浦北县| 阿拉善左旗| 江西省| 汉阴县| 新巴尔虎右旗| 济宁市| 长武县| 肇源县| 昌宁县| 澄城县| 股票| 历史| 星子县| 凤城市| 绥江县|