我需要创建一个可以处理此类网络调用的改造调用适配器:
@GET("user") suspend fun getUser(): MyResponseWrapper<User>
我希望它在不使用Deferred
. 我已经成功实现了 using Deferred
,它可以处理以下方法:
@GET("user") fun getUser(): Deferred<MyResponseWrapper<User>>
但我希望能够使函数成为暂停函数并删除Deferred
包装器。
使用挂起函数,Retrofit 就像Call
在返回类型周围有一个包装器一样工作,因此suspend fun getUser(): User
被视为fun getUser(): Call<User>
我试图创建一个调用适配器来处理这个问题。到目前为止,这是我的实现:
工厂
class MyWrapperAdapterFactory : CallAdapter.Factory() {
override fun get(returnType: Type, annotations: Array<Annotation>, retrofit: Retrofit): CallAdapter<*, *>? {
val rawType = getRawType(returnType)
if (rawType == Call::class.java) {
returnType as? ParameterizedType
?: throw IllegalStateException("$returnType must be parameterized")
val containerType = getParameterUpperBound(0, returnType)
if (getRawType(containerType) != MyWrapper::class.java) {
return null
}
containerType as? ParameterizedType
?: throw IllegalStateException("MyWrapper must be parameterized")
val successBodyType = getParameterUpperBound(0, containerType)
val errorBodyType = getParameterUpperBound(1, containerType)
val errorBodyConverter = retrofit.nextResponseBodyConverter<Any>(
null,
errorBodyType,
annotations
)
return MyWrapperAdapter<Any, Any>(successBodyType, errorBodyConverter)
}
return null
}
陪伴而非守候
米脂
白猪掌柜的
相关分类