我需要创建一个可以处理此类网络调用的改造调用适配器:
@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
}
HUWWW
陪伴而非守候
米脂
白猪掌柜的
随时随地看视频慕课网APP
相关分类