利用Kotlin的方式如何处理网络异常详解
一.前言
之前的文章RxJava处理业务异常的几种方式曾经介绍过Retrofit的异常可以有多种处理方式。
其中,可以使用RxJava的错误处理操作符,它们是专门用来处理异常的。
随便例举两个操作符:
onErrorReturn操作符,表示当发生错误的时候,发射一个默认值然后结束数据流。所以Subscriber看不到异常信息,看到的是正常的数据流结束状态。
onErrorResumeNext操作符,表示当错误发生的时候,使用另外一个数据流继续发射数据。在返回的被观察者中是看不到错误信息的。
二.使用Kotlin的特性
这次我结合Kotlin扩展函数的特性来尝试处理异常。
网络请求返回的Response大多是采用如下这种形式:
{ "code":0, "message":"success", "data":{ ... } }
对于客户端开发而言,我们会封装一个基类的HttpResponse。
dataclassHttpResponse( varcode:Int=-1,//0:成功1:xxx错误或过期2:业务逻辑错误500:系统内部错误998表示Token无效 varmessage:String?=null, vardata:T?=null ):UnProguard{ valisOkStatus:Boolean get()=code==0 }
其中,UnProguard是一个空的接口,主要是方便App在混淆的时候保留部分类。
interfaceUnProguard: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的错误处理操作符,可以编写如下的扩展函数:
importcom.safframework.utils.RetryWithDelay importio.reactivex.Maybe /** * *@FileName: *cn.magicwindow.core.ext.`Maybe+Extension`.kt *@author:TonyShen *@date:2018-07-1917:31 *@versionV1.0<描述当前版本功能> */ /** *尝试重试 *默认有3次重试机会,每次的延迟时间是1000ms */ funMaybe .retryWithDelayMillis(maxRetries:Int=3,retryDelayMillis:Int=1000):Maybe = this.retryWhen(RetryWithDelay(maxRetries,retryDelayMillis)) /** *遇到错误时,能够提前捕获异常,并发射一个默认的值。 *后面无须再做异常处理 */ fun Maybe .errorReturn(defValue:T):Maybe =this.onErrorReturn{ it->it.printStackTrace() return@onErrorReturndefValue } fun Maybe .errorReturn(defValue:T,action:(Throwable)->Unit):Maybe =this.onErrorReturn{ action.invoke(it) return@onErrorReturndefValue } /** *遇到错误时,能够提前捕获异常,并返回一个新的Maybe *后面无须再做异常处理 */ fun Maybe .errorResumeNext(defValue:T):Maybe =this.onErrorResumeNext(Maybe.just(defValue)) fun Maybe .errorResumeNext():Maybe =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的扩展函数,可以编写优雅的代码。而使用高阶函数,则可以达到的进一步的抽象。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。