214 похожих чатов

По фану допиливаю тестовое, подскажите, как правильно обработать ретрофитовские ошибки

типо 500, 404, ...? Или где это глянуть можно, чтобы не было особых заморочек?

Сейчас у меня такая цепь для данных:
View -> VM -> Interactor -> Repository - > (Retrofit/DB/...)

В репозитории есть метод getEmployees(), который либо возвращает интерактору данные из кеша(лист Employee), либо, если кеш пустой, идёт в сеть посредством метода loadEmployees(), получает ответ, кеширует результаты и после этого возвращает интерактору данные.
Я не могу корректно обработать ситуацию, когда из сети пришла ошибка. Раньше я об этом вообще не думал, а сейчас упало Api, а за ним и апка.

Из сети приходит ResponseResult, который я тупо оборачиваю в try/catch, чтобы не упасть. Первое что я попробовал сделать - добавить в ResponseResult поле errorCode и сеттить его внутри catch в случае ошибки. Только сейчас репозиторий отдаёт лист Employee, и его нужно как - то научить передавать ошибку наверх.

Как вариант - передавать что - то вида List<ErrorCode, List<Employee>>.
Или вообще создать свою модель, типа RepositoryResult, которая будет собираться из ResponseResult, в котором будет errorCode и List<Employee>, возвращать эту модель интерактору, маппить её и снова думать над тем как и в каком виде передать ошибку ещё выше.

В теории это будет работать, но вариант "сеттить какое - то поле в случае ошибки, и передавать данные наверх, пока они не дойдут presenter слоя" кажется мне какой - то дичью, очень много мороки, наверное должен быть вариант правильнее.

Как правильно решить проблему?

*Вот код репозитория, я если что претендую на Джуна, так шо не баньте, я играю как умею ((

https://github.com/KirstenLy/TestTask/blob/master/app/src/main/java/com/example/testtask/data/repository/EmployeeRepository.kt

1 ответов

14 просмотров

1. Правильнее всего будет отдавать свою модель ResponseResult. В котлине еще можно отдавать sealed class https://kotlinlang.org/docs/reference/sealed-classes.html С запечатанными классами легче будет работать в презенторе и интеракторе 2. Если это тестовое то почитай про SOLID. У тебя реализация не спрятана за интерфейсы, это всегда сильно бросается в глаза 3. Статический метод для получения контекста это очень плохо. Не используй App.get() Либо прокидывай зависимостью либо добывай из фрагмента или активити 4. Зачем тебе SharedViewModel если итак у тебя репозиторий во первых кеширует данные, а во вторых в di заведен как @Singletone

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Ребят в СИ можно реализовать ООП?
Николай
33
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта