利用Kotlin的方式如何处理网络异常详解

利用Kotlin的方式如何处理网络异常详解,第1张

概述一.前言之前的文章RxJava处理业务异常的几种方式曾经介绍过Retrofit的异常可以有多种处理方式。

一. 前言

之前的文章 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 的扩展函数,可以编写优雅的代码。而使用高阶函数,则可以达到的进一步的抽象。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。

您可能感兴趣的文章:Kotlin 基础教程之异常Kotlin基础学习之循环和异常 总结

以上是内存溢出为你收集整理的利用Kotlin的方式如何处理网络异常详解全部内容,希望文章能够帮你解决利用Kotlin的方式如何处理网络异常详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1142626.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存