RxJava2 Обработка ошибок Обертка для модифицированной службы - PullRequest
0 голосов
/ 26 июня 2019

Мне нужно обработать ошибку глобально в моем приложении для сетевого сервиса, я использую 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 Ответ

2 голосов
/ 26 июня 2019

Поскольку 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))
        }
...