0

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

谁能解释一下?

4

1 回答 1

2

由于RxJava2CallAdapter已经知道如何使返回类型适应和其他 Rx 类型, 因此要求原始工厂创建这样的“原始” 。然后创建自己的- ,其中包含原始适配器。Call<T>Observable<T>CompletableRxErrorCallAdapterFactoryRxJava2CallAdapterFactoryRxJava2CallAdapterRxErrorCallAdapterFactoryCallAdapterRxCallAdapterWrapper

因此RxErrorCallAdapterFactory,给出要转换为RxCallAdapterWrapper的第一个委托给原始的,然后将运算符应用于.RxJava2CallAdapterCall<User>Observable<User>onErrorResumeNext()Observable<User>

当网络请求期间发生错误(例如来自服务器的 400 Bad Request)时,它将传播到onErrorResumeNext()您可以应用错误映射逻辑的地方。在这种情况下,使用 mappedonErrorResumeNext()获取Throwable并返回Observable该信号。onError()Throwable

基本上,如果原始CallApater返回Observable.just(User()),包装器CallAdapter将返回:

    Observable.just(User())
        .onErrorResumeNext { throwable -> 
            Observable.error(map(throwable))
        }
于 2019-06-26T17:37:51.417 回答