Тёмный

Избавляемся от try-catch | Кастомный адаптер для Retrofit 

Android Broadcast. Все об Андроид разработке
Просмотров 9 тыс.
50% 1

#AndroidBroadcast #ЛучшиеПрактики
Применяем мощь Kotlin, для того чтобы избавиться от try-catch при работе с Retrofit, а также и любые другие асинхронные операции.
Полезные ссылки:
🖥️ Код проекта в Github github.com/androidbroadcast/A...
📰 Telegram канал с полезными материалами для Android разработчиков ttttt.me/android_broadcast
💰 Поддержать проект bit.ly/3sratqQ
🐦 Twitter Android Broadcast / andro_broadcast
🔗 Инфраструктура Avito Android в Open Source avito-tech.github.io/avito-an...
🔗 Kotlin Inline Classes kotlinlang.org/docs/reference...
🔗 Retrofit square.github.io/retrofit/
Таймкоды:
0:00 Интро
0:16 Exception в сетевых операциях
3:23 Правильная настройка окружения (Avito Android Open Source)
6:26 Inline классы и обработка ошибок с помощью Result
7:50 Интеграция Result и Retrofit
16:15 Заключение

Наука

Опубликовано:

 

30 июл 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 67   
@AndroidBroadcast
@AndroidBroadcast 3 года назад
🖥️ Код проекта в Github github.com/androidbroadcast/AsyncResult 📰 Telegram канал с полезными материалами для Android разработчиков ttttt.me/android_broadcast 💰 Поддержать проект через Boosty boosty.to/androidbroadcast или Patreon bit.ly/2TBOzlu 🐦 Twitter Android Broadcast twitter.com/andro_broadcast
@alexkovrizhnyi293
@alexkovrizhnyi293 2 года назад
Помимо свежих видео начал просматривать предыдущие, и чем дальше, тем больше хочется респектнуть Кириллу за труды. За прошедший год очень заметен прогресс как в постановке речи, так и в плане картинки. Спасибо за работу. Удачи и развития в дальнейшем!
@AndroidBroadcast
@AndroidBroadcast 2 года назад
Да, недавно сам пересматривал и вижу как расту. Вижу ещё много чего сделать, но не все сразу
@kirill6020
@kirill6020 3 года назад
Спасибо за видео!
@arsen1156
@arsen1156 3 года назад
Крутая студия, рад, что канал развивается!
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Спасибо! Этот год будет довольно бодрый для проекта.
@michaelthirteenth
@michaelthirteenth 3 года назад
Впервые смотрю рекламу от начала до конца, не перематывая ((: И кстати батлу быть!
@alekseyyakovlev6924
@alekseyyakovlev6924 3 года назад
Кирилл, большое тебе спасибо за твои видео и телеграм каналы! Очень много полезной инфы. Было бы круто, если бы ты записал отдельное видео про свою библиотеку ViewBindingPropertyDelegate (примеры использования, когда лучше использовать с рефлексией, а когда без, новые фишки 1.4.0)
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Спасибо за поддержку. Окей, сделаю. Это будет просто.
@vitaliyashchuk8358
@vitaliyashchuk8358 3 года назад
Спасибо за выпуск! И было бы интересно послушать про обработку ошибок
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Что именно про обработку ошибок хочется услышать?
@vitaliyashchuk8358
@vitaliyashchuk8358 3 года назад
@@AndroidBroadcast ты говорил про холивар, как лучше сделать - валить приложение или обрабатывать всё подряд
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Принято
@andrey.shpilevoy
@andrey.shpilevoy 8 месяцев назад
Я так и делал, даже не думал что это проблема)
@maksonic_official
@maksonic_official 3 года назад
Кирилл, красава мужик! Видео очень полезно, интересно слушать, но качество звука, лично мне не очень зашло.🙈Не планируешь петличку купить или микрофон который на стол можно поставить? Я считаю, что с хорошим микрофоном вообще конфетка будет) Спасибо!
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Спасибо; По поводу звука вышел косяк. У меня есть все необходимое оборудование, надо обеспечить достаточное поглощение звука. В будущих видео все уже будет исправлено.
@ki16or
@ki16or 3 года назад
Вот как раз на прошлой неделе писал реализацию кастомного ответа от Retrofit. Только я в любом случае отправлял один класс(не sealed), там был code, isSuccessfull, сериализованный объект, и сериализованный объект ошибки(иногда ошибка приходила в body с кодом ошибки 4xx). Это все было в common модуле kmm, и этот ответ должен обрабатываться(пока что) на уровне платформы. Не уверен, что sealed классы будут работать на iOS. Или будут?
@AndroidBroadcast
@AndroidBroadcast 3 года назад
sealed - это обычный абстрактный класс, у которого на уровне Kotlin есть доп. ограничения и проверки на основе их. Ни вижу проблем для запуска этого на других платформах за пределами JVM
@quverr
@quverr 3 года назад
Картиночка стала лучше ! :)
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Спасибо. Еще есть пару моментов которых надо улучшить, но новая камера + объектив оправдала надежды
@SnowmazeDev
@SnowmazeDev 3 года назад
А почему бы не добавить больше удобных методов к этому резалту? Я когда делал свой Result из котлиновского Result методы брал типа fold, или onSuccess, они довольно удобные
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Я показал самый минимальный вариант. На практике я его наполнял функциями и дополнительными подклассами.
@sergeysukharev1648
@sergeysukharev1648 3 года назад
А как лучше обрабатывать ошибки бизнес-процесса? Например, часто такие ошибки отдают в формате errorCode и errorMessage, которые также должны обрабатываться по месту вызова. Если мы получаем условно статус код 400, мы должны попытаться сделать конвертацию этого ответа в стандартный формат ошибки бизнес-процесса и положить в кастомный BusinessException этот errorCode и errorMessage, а дальше прокидывать как обычную ошибку и смотреть по месту isBusinessError она или нет?
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Сталкивался с аналогичной задачей, когда сервер возвращает внутренние ошибки. Можно создать собственный подкласс Failure и его возвращать как результат выполнения операции. Надо будет модифицировать CallAdapter, чтобы он понимал Response от сервера и превращал его в бизнес ошибку.
@sergeysukharev1648
@sergeysukharev1648 3 года назад
@@AndroidBroadcast спасибо. А как еще быть, если придерживаюсь Clean Architecture, но: 1) Result.data - это DTO объект и, если я правильно понимаю, то из Repository слоя он не может быть проброшен вплоть до Presentation, а вот ошибку по идее можно прокинуть. 2) И если прокидывать, то это должен быть другой Result тогда, с другим типом Result.data. Если мне не изменяет память, то Мартин писал, что объекты для внутреннего слоя должны идти с внешнего и мапиться там? Т.е. берем трехслойку и каждый отдает свой Result со своим data объектом?
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Result прокидывать можно, а вот объекты внутри него надо конвертировать. Я для этого писал специальные функции-расширения map, сегодня добавлю в репозиторий с примером.
@sergeysukharev1648
@sergeysukharev1648 3 года назад
@@AndroidBroadcast хорошо, спасибо, вечерком гляну)
@taraszhupnyk2998
@taraszhupnyk2998 3 года назад
было бы очень полезно всем увидеть простые практики такого типа
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Если предложишь темы, то будет понятно куда двигаться
@taraszhupnyk2998
@taraszhupnyk2998 3 года назад
@@AndroidBroadcast как пример, варианты подписок с ViewModel в самом View, Adapter. Возможно используете что-то простое но хитрое решение. Мне было бы очень интересно как и это видео. Какие-то базовые классы, абстрактные и т.д. Спасибо
@taraszhupnyk2998
@taraszhupnyk2998 3 года назад
@@AndroidBroadcast также интересно было бы работу с обновлениями токенов если есть какое-то решение, к примеру, после 5 минут токен протухает и надо новый)
@caffeinejavacode1475
@caffeinejavacode1475 2 года назад
класс Result тоже использует самый верхний класс Throwable в чем отличие от catch (e: Throwable) также ловите все ошибки которы могут быть
@AndroidBroadcast
@AndroidBroadcast 2 года назад
Так суть Result и есть обернуть исключения и избавиться от необходимости писать try ... catch
@danieldefo7801
@danieldefo7801 3 года назад
Круто. Давай еще!
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Обязательно будет. Уже готовлю
@JokerZipon
@JokerZipon 3 года назад
как реализовать отправку данных, если имеется не устойчивый интернет. Пример: сеть 2G ("e" на телефоне) в поле; пользователь инициирует отправку post -> в ответ приходит timeout exception значит приложение откладывает запрос на 1 минуту и повторно стучится с post отправкой данных пока не будет "200 OK". Как обрабатывать подобные запросы ? где пользователь нажимает 1 кнопку и а дальше само приложение решает судьбу отправки данных (данные 100% должны отправиться, когда будет подходящий интернет).
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Это можно сделать через interceptor в Retrofit
@TheGrandMasterBit
@TheGrandMasterBit 3 года назад
если данные 100% должны отправиться, то попробуй посмотреть в сторону work manager, там можно настроить политику retry и т.д.
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Не подойдёт. Там есть ограничения по частоте вызова и оно неточное. Повторять надо на уровне вызова сетевого запроса
@ivanp3511
@ivanp3511 3 года назад
А с rxjava использовать не получится?
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Получится без проблем, просто пример приведён для Coroutine + Retrofit
@alexeyosadchy5994
@alexeyosadchy5994 Год назад
А зачем это нужно, если можно обернуть в стандартный Response который идет с ретрофит и поддерживается из коробки?
@majesta7757
@majesta7757 Год назад
а как стандартный респонс обработает тебе отсутствие интернета?)
@AndroidBroadcast
@AndroidBroadcast Год назад
Можно в виде какого-то особеного Exception и
@arturvorobyoff9913
@arturvorobyoff9913 3 года назад
Так зачем это? Есть же flow, там можно ловить ошибки спокойно и врапперы никакие не нужны + они built-in
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Flow - это про реактивные асинхронные стримы. Обработка исключений них есть, но фактически это перенос кода из catch блока в catch оператор. Даже в официальной документации приводится пример через try-catch обработку исключений в Flow.
@chaze_chow_chow
@chaze_chow_chow 3 года назад
Спасибо классный видос. Смотрю твои разные видео, не сочти за грубость, но послушай произношение тех английских слов которые ты употребляешь заранее, даже в том же гугле. Джитхаб? Авито тех, каких тех?)
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Говорю как всегда произношу. Как правильно GitHub произносить? АвитоТех - так согласовали и все верно
@chaze_chow_chow
@chaze_chow_chow 3 года назад
@@AndroidBroadcast на сколько я знаю гитхаб, обычно использую если на скорую руку гугловский переводчик, быстро может подсказать как произносится)
@alekseyyakovlev6924
@alekseyyakovlev6924 3 года назад
@@AndroidBroadcast добавлю слова, которые мне резали слух и их проавильное произношение: checked чект unchecked анчект failure фейлиа suspend саспенд
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Принято. Послежу за произношением
@umnikya7874
@umnikya7874 6 месяцев назад
Раз пошла такая пьянка, режь последний огурец. Недавно Кирилла собеседовал Гладков и очень много заполнения пустоты звуком ааа не делайте так никто особенно ПО и ПМ, лиды мы вас слушаем и не надо этих ааа эээээ иииии и подобных для заполнения пустоты, думайте молча. Так же хочу заметить, что соответственно практически грубо говоря исходя из этого можно полностью убирать из роликов иииии речи.
@dzenbuddha5527
@dzenbuddha5527 3 года назад
Видимо, это для продвинутых разработчиков!) не понял как строится класс result и resultFactory Может у Вас есть видео для чайников где описывается каждая строчка?)
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Этот не планировался как контент для чайников, да и канал в целом для разработчиков, которые умеют создавать приложения
@dzenbuddha5527
@dzenbuddha5527 3 года назад
Понятно!
@rpuxa163
@rpuxa163 3 года назад
А я использовал свой CoroutineExceptionHandler чтобы не писать try catch
@AndroidBroadcast
@AndroidBroadcast 3 года назад
С таким решением есть проблемы: 1. Его надо устанавливать в любой CoroutineScope 2. Если где-то упадет ошибка, то она всегда попадает в этот CoroutineExceptionHandler. Это работает неприятно, когда есть вызовы async/await 3. CoroutineExceptionHandler - не подходит для перехвата локальной ошибки, например таймаута и необходимости выполнения какой-то операции. Либо его ставить надо в любой CoroutineScope свой собственный
@rpuxa163
@rpuxa163 3 года назад
@@AndroidBroadcast Да, в принципе согласен, спасибо
@aratj
@aratj 3 года назад
На джаве поддерживаю старый проект, новый на котлине
@ApolloJet86
@ApolloJet86 2 года назад
Не хочется портить красивую цифру в 69 комментариев, но -- спасибо огромноео за это видео.
@AndroidBroadcast
@AndroidBroadcast 2 года назад
Чем больше тем лучше!
@user-wx8cq6ve5d
@user-wx8cq6ve5d 3 года назад
Хз как по мне стандартное решение) единственный совет есть в котлине класс Result он почти такой же.
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Не такой же, он не содержит специфичных ошибок и он inline. Там нельзя обернуть более 1 значения и есть тонкости по работе.
@sergey30027
@sergey30027 3 года назад
крутая заставка, полезный контент, но звук гавно, но т.к. звук уже пофикшен, то все шикарно
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Над звуком ещё работаю. Заказал петличку и уже показался в настройках. Станет лучше, дайте время. Я многому ещё учусь в производстве видео.
@alekseyyakovlev6924
@alekseyyakovlev6924 3 года назад
По качеству звука: в этом видео присутствует достаточно сильное эхо, котого в прошлых видео не было.
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Да, получилось не очень. В будущих видео будет лучше. Работаю над этим вопросом уже.
Далее
Ouch.. 🤕
00:30
Просмотров 5 млн