Retrofit解密:接口请求是如何适配suspend协程?

本文探讨了如何使用Retrofit结合协程的suspend关键字简化网络请求。最初,Retrofit通过动态代理创建服务并使用回调处理异步请求。通过在接口方法上添加suspend关键字,可以使用协程来优雅地处理网络请求,避免回调地狱。在源码分析中,揭示了Retrofit如何识别和适配suspend方法,主要涉及挂起函数的识别、SuspendForResponse或SuspendForBody的创建,以及核心的await()方法在恢复协程执行中的作用。最后,总结了这种改造带来的便捷性,使异步请求如同同步代码般编写。
摘要由CSDN通过智能技术生成

最初的retrofit请求

我们先看下原来如何通过retrofit发起一个网络请求的,这里我们直接以官网的例子举例:

动态代理创建请求服务

interface GitHubService {
    //创建get请求方法
    @GET("users/{user}/repos")
    fun listRepos(@Path("user") user: String?): Call<Response>
}

//动态代理创建GitHubService
fun createService(): GitHubService {
    val retrofit = Retrofit.Builder()
        .baseUrl("https://api.github.com/")
        .build()

    return retrofit.create(GitHubService::class.java)
}
  • retrofit.create底层是通过动态代理创建的GitHubService的一个子实现类;

  • 创建的这个GitHubService一般作为单例进行使用,这里只是简单举例没有实现单例;

发起网络请求

fun main() {
    //异步执行网络请求
    createService().listRepos("").enqueue(object : Callback<Response> {
        override fun onResponse(call: Call<Response>, response: retrofit2.Response<Response>) {
            //主线程网络请求成功回调
        }

        override fun onFailure(call: Call<Response>, t: Throwable) {
            //主线程网络请求失败回调
        }
    })
}

这种调用enqueue()异步方法并执行callback的方式是不是感觉很麻烦,如果有下一个请求依赖上一个请求的执行结果,那就将会形成回调地狱这种可怕场景。
而协程suspend本就有着以同步代码编写执行异步操作的能力,所以天然是解决回调地狱好帮手。接下来我们看下如何使用协程suspend。

借助suspend发起网络请求

suspend声明接口方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值