最初的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声明接口方法