Retrofit 2.6.0 ! 更快捷的协程体验 !

简介: 本篇主要介绍 Retrofit 2.6.0 版本中协程的使用方式,不会过多涉及原理。我以我自己的 wanandroid 应用为例进行改造,源代码中 Retrofit 版本是 2.4.0 。这个 wanandroid 是基于 Kotlin + 协程 + LiveData + MVVM 实现的,具体架构可见我的文章 真香!Kotlin+MVVM+LiveData+协程 打造 Wanandroid! ,个人觉得代码还是比较清晰的,很适合作为 Kotlin 的 入门项目。

老版本 Retrofit 的使用


在介绍如何使用 Retrofit 2.6.0 之前,我们先来看一下老版本的 Retrofit 是如何基于 Kotlin Coroutines 工作的,以登录接口为例。


首先在 WanService 接口中作如下定义:

@POST("/user/login")
fun login(@Field("username") userName: String, 
          @Field("password") passWord: String): Deferred<WanResponse<User>>
复制代码


注意这里使用的返回值是 Deferred<T> 对象,这就意味着使用的时候要通过 await 来获取返回值。那么如何让 Retrofit 直接返回 Deferred<T> 呢?使用的也是 JakeWharton 的开源库:

implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
复制代码


在构建 Client 的时候添加上这个适配器:

...
.addCallAdapterFactory(CoroutineCallAdapterFactory.invoke())
...
复制代码


然后给 LoginRepository 提供一个 suspend 方法:

suspend fun login(userName: String, passWord: String): WanResponse<User> {
    return apiCall { WanRetrofitClient.service.login(userName, passWord).await() }
}
复制代码


这里使用 await 来获取 Deferred<T> 的返回值。

最后在 LoginViewModel 中是这样调用的:

fun login(userName: String, passWord: String) {
    launch {
        val response = withContext(Dispatchers.IO) { repository.login(userName, passWord) }
        executeResponse(response, { mLoginUser.value = response.data }, { errMsg.value = response.errorMsg })
    }
}
复制代码


launch() 方法做了简单的封装,感兴趣的同学可以到源码中看一下。

以上就是在 Retrofit 2.4.0 中使用协程的基本方式了,其实代码也很简洁。而 Retrofit 2.6.0 让这一切更加简单!就让我们一睹为快吧!


Retrofit 2.6.0 中协程的使用


Talking is cheap, show me the code ! 还是上面的登录接口,基于 Retrofit 2.6.0 来改造一下。


第一步,修改 Retrofit 依赖。

implementation 'com.squareup.retrofit2:retrofit:2.6.0'
复制代码


第二步,修改 WanService 中接口的定义。

@POST("/user/login")
suspend fun login(@Field("username") userName: String, 
                  @Field("password") passWord: String): WanResponse<User>
复制代码


看到区别了吗?首先,不再返回 Deferred<T> 对象,而是直接返回我们需要的 WanResponse 对象。其次,使用了 suspend 来修改方法,标记这是挂起函数。

第三步,修改 LoginRepository 中方法定义。


suspend fun login(userName: String, passWord: String): WanResponse<User> {
    return apiCall { WanRetrofitClient.service.login(userName, passWord) }
}
复制代码


与之前的版本相比,这里不需要调用 await 方法了。其实并不是不调用了,而是 Retrofit 帮助我们自动调用了。


最后别忘了去除之前添加的 kotlin-coroutines-adapter,因为我们不再需要人工返回 Deferred<T> 对象,也不再需要手动调用 await 了。

...
//.addCallAdapterFactory(CoroutineCallAdapterFactory.invoke())
...
复制代码


至此,基于 Retrofit 2.6.0 版本的改造就已经完成了。我的 Wanandroid 项目已经完成全部修改,具体修改内容可见 commit


总结


随着 Kotlin 成为 Android 开发的首选语言,越来越多的新特性都将在 Kotlin 上优先实现。协程作为 Kotlin 的异步利器,很值得我们学习。如果你还没有入手,那么,从我的 Wanandroid 开始吧 !



相关文章
|
API Android开发
优雅使用Retrofit,在协程时代遨游安卓网络请求(三)下
优雅使用Retrofit,在协程时代遨游安卓网络请求(三)
78 0
|
自然语言处理 程序员 Android开发
优雅使用Retrofit,在协程时代遨游安卓网络请求(三)上
优雅使用Retrofit,在协程时代遨游安卓网络请求(三)
133 0
|
数据安全/隐私保护 Android开发
优雅使用Retrofit,在协程时代遨游安卓网络请求(二)下
优雅使用Retrofit,在协程时代遨游安卓网络请求(二)
161 0
|
Android开发
优雅使用Retrofit,在协程时代遨游安卓网络请求(一)下
优雅使用Retrofit,在协程时代遨游安卓网络请求(一)
106 0
|
6月前
|
Go Python
使用python实现一个用户态协程
【6月更文挑战第28天】本文探讨了如何在Python中实现类似Golang中协程(goroutines)和通道(channels)的概念。文章最后提到了`wait_for`函数在处理超时和取消操作中的作
58 1
使用python实现一个用户态协程
|
3月前
|
调度 Python
python3 协程实战(python3经典编程案例)
该文章通过多个实战案例介绍了如何在Python3中使用协程来提高I/O密集型应用的性能,利用asyncio库以及async/await语法来编写高效的异步代码。
35 0
|
5月前
|
数据库 开发者 Python
实战指南:用Python协程与异步函数优化高性能Web应用
【7月更文挑战第15天】Python的协程与异步函数优化Web性能,通过非阻塞I/O提升并发处理能力。使用aiohttp库构建异步服务器,示例代码展示如何处理GET请求。异步处理减少资源消耗,提高响应速度和吞吐量,适用于高并发场景。掌握这项技术对提升Web应用性能至关重要。
91 10
|
5月前
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
【7月更文挑战第15天】Python 3.5+引入的协程和异步函数革新了并发编程。协程,轻量级线程,由程序控制切换,降低开销。异步函数是协程的高级形式,允许等待异步操作。通过`asyncio`库,如示例所示,能并发执行任务,提高I/O密集型任务效率,实现并发而非并行,优化CPU利用率。理解和掌握这些工具对于构建高效网络应用至关重要。
61 6
|
5月前
|
大数据 数据处理 API
性能飞跃:Python协程与异步函数在数据处理中的高效应用
【7月更文挑战第15天】在大数据时代,Python的协程和异步函数解决了同步编程的性能瓶颈问题。同步编程在处理I/O密集型任务时效率低下,而Python的`asyncio`库支持的异步编程利用协程实现并发,通过`async def`和`await`避免了不必要的等待,提升了CPU利用率。例如,从多个API获取数据,异步方式使用`aiohttp`并发请求,显著提高了效率。掌握异步编程对于高效处理大规模数据至关重要。
57 4
|
5月前
|
设计模式 机器学习/深度学习 测试技术
设计模式转型:从传统同步到Python协程异步编程的实践与思考
【7月更文挑战第15天】探索从同步到Python协程异步编程的转变,异步处理I/O密集型任务提升效率。async/await关键词定义异步函数,asyncio库管理事件循环。面对挑战,如思维转变、错误处理和调试,可通过逐步迁移、学习资源、编写测试和使用辅助库来适应。通过实践和学习,开发者能有效优化性能和响应速度。
62 3