成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

一. 前言

創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元潮州做網(wǎng)站,已為上家服務(wù),為潮州各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

之前的文章 RxJava處理業(yè)務(wù)異常的幾種方式 曾經(jīng)介紹過(guò) Retrofit 的異??梢杂卸喾N處理方式。

其中,可以使用 RxJava 的錯(cuò)誤處理操作符,它們是專門(mén)用來(lái)處理異常的。

隨便例舉兩個(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ù)的特性來(lái)嘗試處理異常。

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

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

對(duì)于客戶端開(kāi)發(fā)而言,我們會(huì)封裝一個(gè)基類的HttpResponse。

data class HttpResponse<T>(
 var code: Int = -1, //0: 成功 1: xxx錯(cuò)誤或過(guò)期 2: 業(yè)務(wù)邏輯錯(cuò)誤 500:系統(tǒng)內(nèi)部錯(cuò)誤 998表示Token無(wú)效
 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ò)誤處理操作符,可以編寫(xiě)如下的擴(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)的值。
 * 后面無(wú)須再做異常處理
 */
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
 * 后面無(wú)須再做異常處理
 */
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()
   }
  }

這樣無(wú)須在 onError 中處理異常,而且 errorReturn 還是一個(gè)高階函數(shù)。它的 action 參數(shù)傳遞的是一個(gè)函數(shù),專門(mén)用于處理異常。每一個(gè)網(wǎng)絡(luò)請(qǐng)求的異常處理并不會(huì)都一樣,可以用該函數(shù)來(lái)傳遞不同的異常處理。

總結(jié)

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

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。

網(wǎng)頁(yè)題目:利用Kotlin的方式如何處理網(wǎng)絡(luò)異常詳解
URL鏈接:http://jinyejixie.com/article20/psicco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、建站公司、自適應(yīng)網(wǎng)站、標(biāo)簽優(yōu)化、虛擬主機(jī)、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司
县级市| 墨玉县| 乌恰县| 沾化县| 宜兰县| 阿拉尔市| 东山县| 芦溪县| 东乡县| 南漳县| 东山县| 右玉县| 年辖:市辖区| 乌什县| 崇阳县| 七台河市| 黄大仙区| 潜山县| 涟源市| 阿瓦提县| 平武县| 康保县| 万安县| 韩城市| 佳木斯市| 云安县| 靖西县| 西宁市| 台北县| 突泉县| 柳河县| 集贤县| 漳平市| 浮山县| 阿拉善右旗| 邵阳县| 赣榆县| 金塔县| 双流县| 萝北县| 郸城县|