用于翻新服务的RxJava2错误处理包装器

时间:2019-06-26 10:50:35

标签: android retrofit rx-java2 rx-kotlin2

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

任何人都可以对此进行解释吗?

1 个答案:

答案 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))
        }