android - Retrofit 2.6.0:自定义协程 CallAdapterFactory
问题描述
我需要在我的 api 中进行自定义错误处理,并且我想在新版本的 Retrofit 中使用协程。因为我们不用Deferred
再用了,我们自己的 Jake Wharton 一个月前在 reddit 上写了这个
但是我在CallAdapterFactory
正确创建时遇到了问题。
具体来说,我不明白:“委托给内置工厂,然后将值包装在密封类中”
是否有人已经在使用此设置可以提供帮助?
这是当前代码
sealed class Results<out T: Any> {
class Success<out T: Any>(val response: T): Results<T>()
class Failure(val message: String, val serverError: ServerError?): Results<Nothing>()
object NetworkError: Results<Nothing>()
}
class ResultsCallAdapterFactory private constructor() : CallAdapter.Factory() {
companion object {
@JvmStatic
fun create() = ResultsCallAdapterFactory()
}
override fun get(returnType: Type, annotations: Array<Annotation>, retrofit: Retrofit): CallAdapter<*, *>? {
return try {
val enclosedType = returnType as ParameterizedType
val responseType = getParameterUpperBound(0, enclosedType)
val rawResultType = getRawType(responseType)
val delegate: CallAdapter<Any,Any> = retrofit.nextCallAdapter(this,returnType,annotations) as CallAdapter<Any,Any>
if(rawResultType != Results::class.java)
null
else {
object: CallAdapter<Any,Any>{
override fun adapt(call: Call<Any>): Any {
val response = delegate.adapt(call)
//What should happen here?
return response
}
override fun responseType(): Type {
return delegate.responseType()
}
}
}
} catch (e: ClassCastException) {
null
}
}
}
解决方案
我已经创建了这样一个工厂的示例,您可以在 GitHub 上找到它。也看看一个类似的问题:How to create a call adapter for suspending functions in Retrofit? .
推荐阅读
- tensorflow - 错误 tensorflow 2.3:变量未初始化。容器本地主机不存在
- mysql - 如何在 SQL 中针对不同条件使用 CASE
- c++ - 为什么我不能使用 chrono 库?
- azure - 有没有办法在最后一次成功时回滚 devops 管道?
- java - 如果字符串包含某个单词,我如何使用正则表达式跳过它
- angular - 为什么我需要上传我的文件两次才能将其放入数据库?
- c - 如何从 ubuntu 卸载 graphics.h?
- sql - SQL - 如何避免在匹配多个列时从另一个表中插入重复的行
- sql - Postgresql:将uuid转换为int
- python - 安装后没有名为“tensorflow_examples”的模块