我需要在我的网络服务应用程序中全局处理错误,我在改造服务中使用Rxjava2CallAdapterFactory。因此,为了在全球范围内处理错误,我在各个站点进行了搜索,并找到了解决方案。但是我确实知道这是如何工作的。
class RxErrorAdapter private constructor() : CallAdapter.Factory() {
private val original = RxJava2CallAdapterFactory.create()
override fun get(returnType: Type, annotations: Array<Annotation>, retrofit: Retrofit): CallAdapter<*, *>? {
return Wrapper<Any>(original.get(returnType, annotations, retrofit)
?: return null)
}
private class Wrapper<R>(private val wrapped: CallAdapter<R, *>) : CallAdapter<R, Any> {
override fun responseType(): Type {
return wrapped.responseType()
}
override fun adapt(call: Call<R>): Any {
val result = wrapped.adapt(call)
}
}
companion object {
fun create(): CallAdapter.Factory {
return RxErrorAdapter()
}
}
}
任何人都可以对此进行解释吗?
答案 0 :(得分:2)
由于RxJava2CallAdapter
已经知道如何适应将返回类型Call<T>
转换为Observable<T>
,Completable
和其他Rx类型,
RxErrorCallAdapterFactory
要求原始工厂RxJava2CallAdapterFactory
创建这样的“原始” RxJava2CallAdapter
。然后RxErrorCallAdapterFactory
创建自己的CallAdapter
-RxCallAdapterWrapper
,并在其中放入原始适配器。
因此,RxErrorCallAdapterFactory
给出了RxCallAdapterWrapper
,它首先委托原始RxJava2CallAdapter
来将Call<User>
转换为Observable<User>
,然后应用onErrorResumeNext()
运算符Observable<User>
的顶部。
在网络请求期间发生错误时(例如,来自服务器的400错误请求),该错误将传播到onErrorResumeNext()
,您可以在其中应用错误映射逻辑。在这种情况下,onErrorResumeNext()
取Throwable
并返回Observable
,该信号用映射的onError()
通知Throwable
。
基本上,如果原始CallApater
返回Observable.just(User())
,则包装器CallAdapter
将返回以下内容:
Observable.just(User())
.onErrorResumeNext { throwable ->
Observable.error(map(throwable))
}