用于改造服务的 RxJava2 错误处理包装器

RxJava2 Error Handling Wrapper For Retrofit Service

我需要在我的网络服务应用程序中全局处理错误,我在改造服务中使用 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()
        }
    }
}

谁能解释一下?

因为 RxJava2CallAdapter 已经知道如何 适应 一个 return 类型 Call<T>Observable<T>, Completable和其他 Rx 类型, RxErrorCallAdapterFactory请原厂RxJava2CallAdapterFactory打造这样的"original"RxJava2CallAdapter。然后 RxErrorCallAdapterFactory 创建自己的 CallAdapter - RxCallAdapterWrapper,其中包含原始适配器。

所以RxErrorCallAdapterFactory给出RxCallAdapterWrapper先委托给原来的RxJava2CallAdapterCall<User>转换为Observable<User>,然后应用onErrorResumeNext() 运算符位于 Observable<User>.

之上

当网络请求期间发生错误时(例如,来自服务器的 400 错误请求),它将传播到 onErrorResumeNext(),您可以在其中应用您的 error-mapping 逻辑。在这种情况下 onErrorResumeNext() 需要 Throwable 和 returns Observable 信号 onError() 映射 Throwable.

基本上,如果原始 CallApater returns Observable.just(User()),包装器 CallAdapter 将 return 这个:

    Observable.just(User())
        .onErrorResumeNext { throwable -> 
            Observable.error(map(throwable))
        }