利用芬兰湾的科特林的方式如何处理网络异常详解

  


  

  

之前的文章RxJava处理业务异常的几种方式曾经介绍过翻新的异常可以有多种处理方式。
  

  

其中,可以使用RxJava的错误处理操作符,它们是专门用来处理异常的。
  

  

随便例举两个操作符:

  
  

onErrorReturn操作符,表示当发生错误的时候,发射一个默认值然后结束数据流,所以用户看不到异常信息,看到的是正常的数据流结束状态。

  
  

onErrorResumeNext操作符,表示当错误发生的时候,使用另外一个数据流继续发射数据。在返回的被观察者中是看不到错误信息的。

     


  

  

这次我结合芬兰湾的科特林扩展函数的特性来尝试处理异常。
  

  

网络请求返回大的反应多是采用如下这种形式:
  

        {   “代码”:0,   “信息”:“成功”,   "数据":{   …   }   }      

对于客户端开发而言,我们会封装一个基类的HttpResponse。
  

        数据类HttpResponse (   var代码:Int=1//0:成功1:xxx错误或过第2期:业务逻辑错误500:系统内部错误998表示牌无效   var信息:字符串# 63;=零,   var数据:t # 63;=零   ):UnProguard {   val isOkStatus:布尔   get()代码===0   }      

其中,UnProguard是一个空的接口,主要是方便应用在混淆的时候保留部分类。
  

        接口UnProguard:可序列化的      

通常情况下,我们会在观察者的>   viewModel.getHelps(这)   .subscribe ({   如果(it.isOkStatus) {   multi_status_view.showContent ()   adapter.addData (it.data& # 63; .list)   其他}{   multi_status_view.showError ()   }   },{multi_status_view.showError ()})      

如果我们利用RxJava的错误处理操作符,可以编写如下的扩展函数:
  

        进口com.safframework.utils.RetryWithDelay   进口io.reactivex.Maybe/* *   *   * @FileName:   * cn.magicwindow.core.ext. .kt也许+扩展   * @author:托尼沈   * @date: 2018-07-19 17:31   * @version V1.0 & lt;描述当前版本功能比;   *//* *   *尝试重试   * & # 65279;默认有3次重试机会,每次的延迟时间是1000 ms   */有趣的& lt; T>Maybe。retryWithDelayMillis (maxRetries: Int=3, retryDelayMillis: Int=1000): Maybe=this.retryWhen (RetryWithDelay (maxRetries, retryDelayMillis))/* *   *遇到错误时,能够提前捕获异常,并发射一个默认的值。   *后面无须再做异常处理   */有趣的& lt; T>Maybe=nErrorReturn {      它比;it.printStackTrace ()   return@onErrorReturn defValue   }      有趣的& lt; T>Maybe。errorReturn (defValue: T,行动:(Throwable)→单位):Maybe=nErrorReturn {      action.invoke (it)      return@onErrorReturn defValue   }/* *   *遇到错误时,能够提前捕获异常,并返回一个新的可能   *后面无须再做异常处理   */有趣的& lt; T>Maybe=this.onErrorResumeNext (Maybe.just (defValue))         有趣的& lt; T>Maybe=this.onErrorResumeNext (Maybe.empty ())      

扩展函数errorReturn的使用:
  

        viewModel.getHelps(这)   .errorReturn (HttpResponse ()) {   multi_status_view.showError ()   }   .subscribe {   如果(it.isOkStatus) {   multi_status_view.showContent ()   adapter.addData (it.data& # 63; .list)   其他}{   multi_status_view.showError ()   }   }      

这样无须在onError中处理异常,而且errorReturn还是一个高阶函数。它的行动参数传递的是一个函数,专门用于处理异常。每一个网络请求的异常处理并不会都一样,可以用该函数来传递不同的异常处理。
  

  


  

  

合理利用芬兰湾的科特林的扩展函数,可以编写优雅的代码。而使用高阶函数,则可以达到的进一步的抽象。

  

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

利用芬兰湾的科特林的方式如何处理网络异常详解