Unat
Anonymous
Я подумаю =)
Unat
посмотри что получится
Chriz
Ты же его всёравно дальше бросаеш
Anonymous
Anonymous
Во поймал
Unat
Там есть ещё addNetworkInterceptor
Chriz
в Rx есть такая фишка .onErrorResumeNext { }
Anonymous
Все спс, расходимся)
Unat
Aleksey
Chriz
.onErrorResumeNext(errorHandler::resolveError)
Aleksey
Chriz
+1 строка к каждому запросу
Chriz
а бродкастить в интерсепторе лучше ?
Aleksey
Интересно, что ты планируешь возвращать из такого хендлера
Aleksey
Chriz
Так хотябы утечек не будет
Aleksey
А утечкам откуда взяться?
Aleksey
А не через всякие там шины пробрасывал события показа чего-либо
Chriz
в resolveError eщё можно групировать в CustomException если у них эфект одинаковый будет. Зачем в каждом .subscribe делать большой when блок ?
Aleksey
Aleksey
Chriz
В одном проэкте у нас в нём был еще context чтобы показывать тоасты при некоторых ошибок.
Chriz
Например в соединении много ошибок. Если проблема в этом то можно вернуть кастомный NetworkException()
Aleksey
Ура, добавляем ErrorHandler в качестве зависимости во все репозитории/презентеры 🎉
Aleksey
Ну такое. Лучше, чем when в каждой подписке, но все равно не очень.
Chriz
репозитория обычно одна, так что проблемой не будет. Ну если их там просто дофига, что ответ не подойдёт
Chriz
А вот в текущем проэкте, у нас RxCallAdapteryFactoryWrapper и всё там
Aleksey
Chriz
При ошибке нам сервер отправлает коды и текст который нужно показать, мы body из Exception конвертируем в ErrorModel, и отправляем внутри Exception
Aleksey
Chriz
Почему там ?
Chriz
Interceptor то что стоит по середине, Adapter это когда ответ есть и нужно обработать
Aleksey
Почему там ?
Потому что это место, у которого есть доступ к запросу, самый низкий уровень
CallAdapter должен работа ь с трансформацией OkHttp Call в нужные - Rx, Coroutine и тд
Chriz
Interceptor мы используем для oAuth, Language, и проверяем Connection Перед запросом
Aleksey
Aleksey
Можно пост-обработку делать
Chriz
Есть, но это не значит что нужно там использовать
Aleksey
Chriz
Почему ? конвертить ответ в желаемую модэль задача для CallAdapter ? У нас она этим и занимается
Chriz
ах
Chriz
это ещё не всё
Chriz
каждый Api могут иметь разные ответы error, мы пользуемя потациями чтобы сказать какая модель нужна
Chriz
в интерсепторе нету доступа к нотациям DAO
Aleksey
Aleksey
Aleksey
Chriz
Неправельно написал, каждый метод имеет разные ответы
Chriz
@ErrorType(CatError::class)
getCats(): Maybe<Cats>
Aleksey
Aleksey
Chriz
Предлагаеш для каждого метода создать собвственный webservice с разными интеспторами ?
Aleksey
Интересно, как выглядит адаптер - куча if-else?
Aleksey
Chriz
интерсепторами*
Aleksey
Всё ещё не нужны аннотации
Chriz
Aleksey
ты это а чём ?
Это я о том, как он решает, как обработать класс ошибки и какие из него достать поля
Chriz
используем Gson чтобы сконвертить json ответ в класс который находится в аннотации - 2 строки всего
Aleksey
Aleksey
У тебя есть CatError, DogError
Как понять, какие у кого поля?
Ты же не можешь в onNext кинуть два разных типа
Chriz
Возвращаем его в onError
Chriz
где ему и место ))
Aleksey
И в чём профит тогда?
Там снова нужно кастить
Chriz
Это происходит автоматом, у нас же не 1 error может случится.
Aleksey
А сколько? Контракт Rx таков, что только один error на цепь.
Chriz
Я всмысле много разных Exception
Aleksey
Автоматом в UI Throwable превращается в CatError?
Chriz
ConnectionException, MapException, ResponseException
Aleksey
А почему тогда не Converter, а CallAdapter?)
Aleksey
Кажется, в Converter этому самое место
Chriz
when(throwable)
is ResponseException -> {
showError((throwable.response as CatError).text)
}
is ConnectionException -> doBlabla
is MapException -> doBoBoBo
Chriz
чтото такое в итоге
Aleksey