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

แชร์
ฝัง
  • เผยแพร่เมื่อ 5 ม.ค. 2025

ความคิดเห็น • 67

  • @AndroidBroadcast
    @AndroidBroadcast  4 ปีที่แล้ว +4

    🖥️ Код проекта в 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 3 ปีที่แล้ว +6

    Помимо свежих видео начал просматривать предыдущие, и чем дальше, тем больше хочется респектнуть Кириллу за труды. За прошедший год очень заметен прогресс как в постановке речи, так и в плане картинки. Спасибо за работу. Удачи и развития в дальнейшем!

    • @AndroidBroadcast
      @AndroidBroadcast  3 ปีที่แล้ว +2

      Да, недавно сам пересматривал и вижу как расту. Вижу ещё много чего сделать, но не все сразу

  • @arsen1156
    @arsen1156 4 ปีที่แล้ว +4

    Крутая студия, рад, что канал развивается!

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Спасибо! Этот год будет довольно бодрый для проекта.

  • @michaelthirteenth
    @michaelthirteenth 4 ปีที่แล้ว +1

    Впервые смотрю рекламу от начала до конца, не перематывая ((: И кстати батлу быть!

  • @vitaliyashchuk8358
    @vitaliyashchuk8358 4 ปีที่แล้ว +3

    Спасибо за выпуск! И было бы интересно послушать про обработку ошибок

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Что именно про обработку ошибок хочется услышать?

    • @vitaliyashchuk8358
      @vitaliyashchuk8358 4 ปีที่แล้ว +1

      @@AndroidBroadcast ты говорил про холивар, как лучше сделать - валить приложение или обрабатывать всё подряд

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว +2

      Принято

  • @andrey.shpilevoy
    @andrey.shpilevoy ปีที่แล้ว

    Я так и делал, даже не думал что это проблема)

  • @alekseyyakovlev6924
    @alekseyyakovlev6924 4 ปีที่แล้ว +2

    Кирилл, большое тебе спасибо за твои видео и телеграм каналы! Очень много полезной инфы.
    Было бы круто, если бы ты записал отдельное видео про свою библиотеку ViewBindingPropertyDelegate (примеры использования, когда лучше использовать с рефлексией, а когда без, новые фишки 1.4.0)

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Спасибо за поддержку. Окей, сделаю. Это будет просто.

  • @caffeinejavacode1475
    @caffeinejavacode1475 3 ปีที่แล้ว +1

    класс Result тоже использует самый верхний класс Throwable
    в чем отличие от catch (e: Throwable)
    также ловите все ошибки которы могут быть

    • @AndroidBroadcast
      @AndroidBroadcast  3 ปีที่แล้ว +1

      Так суть Result и есть обернуть исключения и избавиться от необходимости писать try ... catch

  • @shrekinator8000
    @shrekinator8000 4 ปีที่แล้ว +1

    А как лучше обрабатывать ошибки бизнес-процесса? Например, часто такие ошибки отдают в формате errorCode и errorMessage, которые также должны обрабатываться по месту вызова. Если мы получаем условно статус код 400, мы должны попытаться сделать конвертацию этого ответа в стандартный формат ошибки бизнес-процесса и положить в кастомный BusinessException этот errorCode и errorMessage, а дальше прокидывать как обычную ошибку и смотреть по месту isBusinessError она или нет?

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Сталкивался с аналогичной задачей, когда сервер возвращает внутренние ошибки. Можно создать собственный подкласс Failure и его возвращать как результат выполнения операции. Надо будет модифицировать CallAdapter, чтобы он понимал Response от сервера и превращал его в бизнес ошибку.

    • @shrekinator8000
      @shrekinator8000 4 ปีที่แล้ว

      @@AndroidBroadcast спасибо. А как еще быть, если придерживаюсь Clean Architecture, но: 1) Result.data - это DTO объект и, если я правильно понимаю, то из Repository слоя он не может быть проброшен вплоть до Presentation, а вот ошибку по идее можно прокинуть. 2) И если прокидывать, то это должен быть другой Result тогда, с другим типом Result.data. Если мне не изменяет память, то Мартин писал, что объекты для внутреннего слоя должны идти с внешнего и мапиться там? Т.е. берем трехслойку и каждый отдает свой Result со своим data объектом?

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว +1

      Result прокидывать можно, а вот объекты внутри него надо конвертировать. Я для этого писал специальные функции-расширения map, сегодня добавлю в репозиторий с примером.

    • @shrekinator8000
      @shrekinator8000 4 ปีที่แล้ว

      @@AndroidBroadcast хорошо, спасибо, вечерком гляну)

  • @kirill6020
    @kirill6020 4 ปีที่แล้ว

    Спасибо за видео!

  • @maksonic_official
    @maksonic_official 4 ปีที่แล้ว +3

    Кирилл, красава мужик! Видео очень полезно, интересно слушать, но качество звука, лично мне не очень зашло.🙈Не планируешь петличку купить или микрофон который на стол можно поставить? Я считаю, что с хорошим микрофоном вообще конфетка будет) Спасибо!

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว +3

      Спасибо; По поводу звука вышел косяк. У меня есть все необходимое оборудование, надо обеспечить достаточное поглощение звука. В будущих видео все уже будет исправлено.

  • @quverr
    @quverr 4 ปีที่แล้ว +1

    Картиночка стала лучше ! :)

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Спасибо. Еще есть пару моментов которых надо улучшить, но новая камера + объектив оправдала надежды

  • @SnowmazeDev
    @SnowmazeDev 4 ปีที่แล้ว +1

    А почему бы не добавить больше удобных методов к этому резалту? Я когда делал свой Result из котлиновского Result методы брал типа fold, или onSuccess, они довольно удобные

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Я показал самый минимальный вариант. На практике я его наполнял функциями и дополнительными подклассами.

  • @alexeyosadchy5994
    @alexeyosadchy5994 2 ปีที่แล้ว

    А зачем это нужно, если можно обернуть в стандартный Response который идет с ретрофит и поддерживается из коробки?

    • @majesta7757
      @majesta7757 ปีที่แล้ว

      а как стандартный респонс обработает тебе отсутствие интернета?)

    • @AndroidBroadcast
      @AndroidBroadcast  ปีที่แล้ว

      Можно в виде какого-то особеного Exception и

  • @taraszhupnyk2998
    @taraszhupnyk2998 4 ปีที่แล้ว +1

    было бы очень полезно всем увидеть простые практики такого типа

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Если предложишь темы, то будет понятно куда двигаться

    • @taraszhupnyk2998
      @taraszhupnyk2998 4 ปีที่แล้ว

      @@AndroidBroadcast как пример, варианты подписок с ViewModel в самом View, Adapter. Возможно используете что-то простое но хитрое решение. Мне было бы очень интересно как и это видео. Какие-то базовые классы, абстрактные и т.д. Спасибо

    • @taraszhupnyk2998
      @taraszhupnyk2998 4 ปีที่แล้ว

      @@AndroidBroadcast также интересно было бы работу с обновлениями токенов если есть какое-то решение, к примеру, после 5 минут токен протухает и надо новый)

  • @JokerZipon
    @JokerZipon 4 ปีที่แล้ว

    как реализовать отправку данных, если имеется не устойчивый интернет. Пример: сеть 2G ("e" на телефоне) в поле; пользователь инициирует отправку post -> в ответ приходит timeout exception значит приложение откладывает запрос на 1 минуту и повторно стучится с post отправкой данных пока не будет "200 OK".
    Как обрабатывать подобные запросы ? где пользователь нажимает 1 кнопку и а дальше само приложение решает судьбу отправки данных (данные 100% должны отправиться, когда будет подходящий интернет).

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Это можно сделать через interceptor в Retrofit

    • @TheGrandMasterBit
      @TheGrandMasterBit 4 ปีที่แล้ว

      если данные 100% должны отправиться, то попробуй посмотреть в сторону work manager, там можно настроить политику retry и т.д.

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Не подойдёт. Там есть ограничения по частоте вызова и оно неточное. Повторять надо на уровне вызова сетевого запроса

  • @ki16or
    @ki16or 4 ปีที่แล้ว

    Вот как раз на прошлой неделе писал реализацию кастомного ответа от Retrofit.
    Только я в любом случае отправлял один класс(не sealed), там был code, isSuccessfull, сериализованный объект, и сериализованный объект ошибки(иногда ошибка приходила в body с кодом ошибки 4xx).
    Это все было в common модуле kmm, и этот ответ должен обрабатываться(пока что) на уровне платформы. Не уверен, что sealed классы будут работать на iOS. Или будут?

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      sealed - это обычный абстрактный класс, у которого на уровне Kotlin есть доп. ограничения и проверки на основе их. Ни вижу проблем для запуска этого на других платформах за пределами JVM

  • @alekseyyakovlev6924
    @alekseyyakovlev6924 4 ปีที่แล้ว +2

    По качеству звука: в этом видео присутствует достаточно сильное эхо, котого в прошлых видео не было.

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว +1

      Да, получилось не очень. В будущих видео будет лучше. Работаю над этим вопросом уже.

  • @ivanp3511
    @ivanp3511 4 ปีที่แล้ว

    А с rxjava использовать не получится?

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Получится без проблем, просто пример приведён для Coroutine + Retrofit

  • @danieldefo7801
    @danieldefo7801 4 ปีที่แล้ว

    Круто. Давай еще!

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Обязательно будет. Уже готовлю

  • @rpuxa163
    @rpuxa163 4 ปีที่แล้ว +2

    А я использовал свой CoroutineExceptionHandler чтобы не писать try catch

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว +1

      С таким решением есть проблемы:
      1. Его надо устанавливать в любой CoroutineScope
      2. Если где-то упадет ошибка, то она всегда попадает в этот CoroutineExceptionHandler. Это работает неприятно, когда есть вызовы async/await
      3. CoroutineExceptionHandler - не подходит для перехвата локальной ошибки, например таймаута и необходимости выполнения какой-то операции. Либо его ставить надо в любой CoroutineScope свой собственный

    • @rpuxa163
      @rpuxa163 4 ปีที่แล้ว +1

      @@AndroidBroadcast Да, в принципе согласен, спасибо

  • @arturvorobyoff9913
    @arturvorobyoff9913 4 ปีที่แล้ว

    Так зачем это? Есть же flow, там можно ловить ошибки спокойно и врапперы никакие не нужны
    + они built-in

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Flow - это про реактивные асинхронные стримы. Обработка исключений них есть, но фактически это перенос кода из catch блока в catch оператор. Даже в официальной документации приводится пример через try-catch обработку исключений в Flow.

  • @chaze_chow_chow
    @chaze_chow_chow 4 ปีที่แล้ว +2

    Спасибо классный видос. Смотрю твои разные видео, не сочти за грубость, но послушай произношение тех английских слов которые ты употребляешь заранее, даже в том же гугле. Джитхаб? Авито тех, каких тех?)

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว +2

      Говорю как всегда произношу. Как правильно GitHub произносить? АвитоТех - так согласовали и все верно

    • @chaze_chow_chow
      @chaze_chow_chow 4 ปีที่แล้ว

      @@AndroidBroadcast на сколько я знаю гитхаб, обычно использую если на скорую руку гугловский переводчик, быстро может подсказать как произносится)

    • @alekseyyakovlev6924
      @alekseyyakovlev6924 4 ปีที่แล้ว +3

      @@AndroidBroadcast добавлю слова, которые мне резали слух и их проавильное произношение:
      checked чект
      unchecked анчект
      failure фейлиа
      suspend саспенд

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว +3

      Принято. Послежу за произношением

    • @umnikya7874
      @umnikya7874 11 หลายเดือนก่อน

      Раз пошла такая пьянка, режь последний огурец. Недавно Кирилла собеседовал Гладков и очень много заполнения пустоты звуком ааа не делайте так никто особенно ПО и ПМ, лиды мы вас слушаем и не надо этих ааа эээээ иииии и подобных для заполнения пустоты, думайте молча. Так же хочу заметить, что соответственно практически грубо говоря исходя из этого можно полностью убирать из роликов иииии речи.

  • @dzenbuddha5527
    @dzenbuddha5527 3 ปีที่แล้ว

    Видимо, это для продвинутых разработчиков!) не понял как строится класс result и resultFactory
    Может у Вас есть видео для чайников где описывается каждая строчка?)

    • @AndroidBroadcast
      @AndroidBroadcast  3 ปีที่แล้ว +1

      Этот не планировался как контент для чайников, да и канал в целом для разработчиков, которые умеют создавать приложения

    • @dzenbuddha5527
      @dzenbuddha5527 3 ปีที่แล้ว

      Понятно!

  • @ApolloJet86
    @ApolloJet86 2 ปีที่แล้ว

    Не хочется портить красивую цифру в 69 комментариев, но -- спасибо огромноео за это видео.

  • @aratj
    @aratj 3 ปีที่แล้ว

    На джаве поддерживаю старый проект, новый на котлине

  • @АндрейПаламаренко-ь4ж
    @АндрейПаламаренко-ь4ж 4 ปีที่แล้ว

    Хз как по мне стандартное решение) единственный совет есть в котлине класс Result он почти такой же.

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว +1

      Не такой же, он не содержит специфичных ошибок и он inline. Там нельзя обернуть более 1 значения и есть тонкости по работе.

  • @sergey30027
    @sergey30027 4 ปีที่แล้ว

    крутая заставка, полезный контент, но звук гавно, но т.к. звук уже пофикшен, то все шикарно

    • @AndroidBroadcast
      @AndroidBroadcast  4 ปีที่แล้ว

      Над звуком ещё работаю. Заказал петличку и уже показался в настройках. Станет лучше, дайте время. Я многому ещё учусь в производстве видео.