retrofit 协程 封装
时间: 2023-09-11 11:03:25 浏览: 124
对于Retrofit与协程的结合,可以通过封装来简化使用和处理异步操作。以下是一个简单的示例:
首先,你可以创建一个协程适配器(CoroutineCallAdapterFactory)并添加到Retrofit的Builder中:
```kotlin
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.build()
```
接下来,你可以定义一个封装了异步操作的协程函数,例如:
```kotlin
suspend fun <T> Call<T>.await(): T {
return suspendCancellableCoroutine { continuation ->
enqueue(object : Callback<T> {
override fun onResponse(call: Call<T>, response: Response<T>) {
if (response.isSuccessful) {
response.body()?.let {
continuation.resume(it)
} ?: continuation.resumeWithException(NullPointerException("Response body is null"))
} else {
continuation.resumeWithException(HttpException(response))
}
}
override fun onFailure(call: Call<T>, t: Throwable) {
if (continuation.isCancelled) return
continuation.resumeWithException(t)
}
})
continuation.invokeOnCancellation {
try {
cancel()
} catch (ex: Throwable) {
// Ignore cancel exception
}
}
}
}
```
这个函数将一个Retrofit的Call对象转换为一个挂起函数,它会在请求完成时返回结果或抛出异常。
最后,你可以在协程中使用封装后的Retrofit方法,例如:
```kotlin
suspend fun fetchData(): List<Item> {
val service = retrofit.create(ApiService::class.java)
val response = service.getItems().await()
return response.items
}
```
这样,你就可以使用协程的方式来发起异步请求并获取结果了。注意,上述代码中的`ApiService`是你自己定义的Retrofit接口。
希望以上示例能对你有所帮助!
阅读全文