Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要 [复制链接]

2019-11-8 10:47
rongchuang 阅读:206 评论:0 赞:0

一、前言

  • 本文不讨论协程、Retrofit、MVVM的原理以及基本使用,需要的可以在其他博主那儿找到很好的文章。
  • 本文没有选择DataBinding的双向绑定方式,因为个人觉得DataBinding污染了xml,并且在定位错误问题上比较麻烦
  • 也没有采用Flux、Redux、ReKotlin这样的框架,因为目前还不太熟。
  • 可以把本文看作是一篇实现过程纪要,欢迎交流分享,提出建议。

二、过程与思考

基本依赖

  • 生命周期组件相关
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-beta01'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-beta01"
  • 协程
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0"
  • 网络
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'

备注:Retrofit 在2.6以后对协程有了更友好的实现方式,所以在版本选择上是有要求的。

动手之前

因为接入协程的缘故,像以前以回调onResponse,onFailure的回调方式是不太符合协程设计的。Kotlin协程对于Retrofit的onFailure处理是直接以Trowable进行抛出的,所以在一开始就要构建好对执行Retrofit的挂机代码块的try..catch设计。

基本的网络访问封装

基本操作还是要有的

Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

定义基本的Api返回类

Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

定义一个Api以便于测试

Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

封装BaseViewModel

网络请求必须在子线程中进行,这是Android开发常理,使用协程进行网络请求在代码上可以让异步代码看起来是同步执行,这很大得提高了代码得可读性,不过理解挂起的确需要时间。BaseViewModel中最终得事情就是要搭建关于协程对于Retrofit网络请求代码块得try..catch。

  • 重要得try..catch
Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

将捕获到得异常进行下放保证执行过程中得情况都是可控得。

  • main线程
Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

  • IO线程
Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

  • 不要忘记onCleared
Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

错误处理

错误处理分为1.请求异常(及trycatch中的异常),2.服务器返回的响应体中定义的异常,这些异常只要是带有网络访问性质的APP上都是常见的,所以对NetWork的异常处理我定义了一个NetWorkError.kt文件,里面的函数为顶级函数,这样方便在项目的其他位置直接访问而不需要通过类名或者实例化操作就可以访问。

try catch异常处理

像一般触发的链接超时、解析异常都可以做出处理,如果不try catch,那么APP有可能会崩溃,或者长时间没有任何回执,体验很差

Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要


服务器定义的响应异常

一般服务器对于请求都存在响应码,客户端根据响应码去做响应的处理,不同的错误码会有不同的日志回馈或者提示,但这都是建立在请求成功上的。这里一般无非为成功和失败。

  • Http请求响应封装
Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

  • 错误枚举
Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

  • 错误处理

  • 对HttpResponse进行处理
Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

这里是直接对HttpRespoonse进行处理,还需要对当前的响应内容有一个转换

  • 转换服务器响应
Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

暂时定义为一个扩展函数,方便结合this使用。基本封装完成以后,开始搞一个测试类来进行测试。


测试

  • client
Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

  • model
Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

  • viewModel
Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

  • 最后在LoginAct对loginState实现监听
Kotlin 协程+Retrofit+MVVM 搭建网络请求实现纪要

三、总结

这是目前自己能够想到的一些方式,个人觉得Kotlin的确带来很大的改观,特别是在可读性和维护性上。虽然在架构和整体设计这件事情上,本来就没有标准的方式,这些问题都是相对的。

对于DataBinding的双向绑定方式期待后期Google能有更好的实现方案,或者也可以考虑单向数据流的实现框架。


我来说两句
您需要登录后才可以评论 登录 | 立即注册
facelist
所有评论(0)
领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )