🖥️ Код проекта в 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
Помимо свежих видео начал просматривать предыдущие, и чем дальше, тем больше хочется респектнуть Кириллу за труды. За прошедший год очень заметен прогресс как в постановке речи, так и в плане картинки. Спасибо за работу. Удачи и развития в дальнейшем!
Кирилл, большое тебе спасибо за твои видео и телеграм каналы! Очень много полезной инфы. Было бы круто, если бы ты записал отдельное видео про свою библиотеку ViewBindingPropertyDelegate (примеры использования, когда лучше использовать с рефлексией, а когда без, новые фишки 1.4.0)
А как лучше обрабатывать ошибки бизнес-процесса? Например, часто такие ошибки отдают в формате errorCode и errorMessage, которые также должны обрабатываться по месту вызова. Если мы получаем условно статус код 400, мы должны попытаться сделать конвертацию этого ответа в стандартный формат ошибки бизнес-процесса и положить в кастомный BusinessException этот errorCode и errorMessage, а дальше прокидывать как обычную ошибку и смотреть по месту isBusinessError она или нет?
Сталкивался с аналогичной задачей, когда сервер возвращает внутренние ошибки. Можно создать собственный подкласс Failure и его возвращать как результат выполнения операции. Надо будет модифицировать CallAdapter, чтобы он понимал Response от сервера и превращал его в бизнес ошибку.
@@AndroidBroadcast спасибо. А как еще быть, если придерживаюсь Clean Architecture, но: 1) Result.data - это DTO объект и, если я правильно понимаю, то из Repository слоя он не может быть проброшен вплоть до Presentation, а вот ошибку по идее можно прокинуть. 2) И если прокидывать, то это должен быть другой Result тогда, с другим типом Result.data. Если мне не изменяет память, то Мартин писал, что объекты для внутреннего слоя должны идти с внешнего и мапиться там? Т.е. берем трехслойку и каждый отдает свой Result со своим data объектом?
Result прокидывать можно, а вот объекты внутри него надо конвертировать. Я для этого писал специальные функции-расширения map, сегодня добавлю в репозиторий с примером.
Кирилл, красава мужик! Видео очень полезно, интересно слушать, но качество звука, лично мне не очень зашло.🙈Не планируешь петличку купить или микрофон который на стол можно поставить? Я считаю, что с хорошим микрофоном вообще конфетка будет) Спасибо!
Спасибо; По поводу звука вышел косяк. У меня есть все необходимое оборудование, надо обеспечить достаточное поглощение звука. В будущих видео все уже будет исправлено.
А почему бы не добавить больше удобных методов к этому резалту? Я когда делал свой Result из котлиновского Result методы брал типа fold, или onSuccess, они довольно удобные
@@AndroidBroadcast как пример, варианты подписок с ViewModel в самом View, Adapter. Возможно используете что-то простое но хитрое решение. Мне было бы очень интересно как и это видео. Какие-то базовые классы, абстрактные и т.д. Спасибо
@@AndroidBroadcast также интересно было бы работу с обновлениями токенов если есть какое-то решение, к примеру, после 5 минут токен протухает и надо новый)
как реализовать отправку данных, если имеется не устойчивый интернет. Пример: сеть 2G ("e" на телефоне) в поле; пользователь инициирует отправку post -> в ответ приходит timeout exception значит приложение откладывает запрос на 1 минуту и повторно стучится с post отправкой данных пока не будет "200 OK". Как обрабатывать подобные запросы ? где пользователь нажимает 1 кнопку и а дальше само приложение решает судьбу отправки данных (данные 100% должны отправиться, когда будет подходящий интернет).
Вот как раз на прошлой неделе писал реализацию кастомного ответа от Retrofit. Только я в любом случае отправлял один класс(не sealed), там был code, isSuccessfull, сериализованный объект, и сериализованный объект ошибки(иногда ошибка приходила в body с кодом ошибки 4xx). Это все было в common модуле kmm, и этот ответ должен обрабатываться(пока что) на уровне платформы. Не уверен, что sealed классы будут работать на iOS. Или будут?
sealed - это обычный абстрактный класс, у которого на уровне Kotlin есть доп. ограничения и проверки на основе их. Ни вижу проблем для запуска этого на других платформах за пределами JVM
С таким решением есть проблемы: 1. Его надо устанавливать в любой CoroutineScope 2. Если где-то упадет ошибка, то она всегда попадает в этот CoroutineExceptionHandler. Это работает неприятно, когда есть вызовы async/await 3. CoroutineExceptionHandler - не подходит для перехвата локальной ошибки, например таймаута и необходимости выполнения какой-то операции. Либо его ставить надо в любой CoroutineScope свой собственный
Flow - это про реактивные асинхронные стримы. Обработка исключений них есть, но фактически это перенос кода из catch блока в catch оператор. Даже в официальной документации приводится пример через try-catch обработку исключений в Flow.
Спасибо классный видос. Смотрю твои разные видео, не сочти за грубость, но послушай произношение тех английских слов которые ты употребляешь заранее, даже в том же гугле. Джитхаб? Авито тех, каких тех?)
Раз пошла такая пьянка, режь последний огурец. Недавно Кирилла собеседовал Гладков и очень много заполнения пустоты звуком ааа не делайте так никто особенно ПО и ПМ, лиды мы вас слушаем и не надо этих ааа эээээ иииии и подобных для заполнения пустоты, думайте молча. Так же хочу заметить, что соответственно практически грубо говоря исходя из этого можно полностью убирать из роликов иииии речи.
Видимо, это для продвинутых разработчиков!) не понял как строится класс result и resultFactory Может у Вас есть видео для чайников где описывается каждая строчка?)
🖥️ Код проекта в 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
Помимо свежих видео начал просматривать предыдущие, и чем дальше, тем больше хочется респектнуть Кириллу за труды. За прошедший год очень заметен прогресс как в постановке речи, так и в плане картинки. Спасибо за работу. Удачи и развития в дальнейшем!
Да, недавно сам пересматривал и вижу как расту. Вижу ещё много чего сделать, но не все сразу
Крутая студия, рад, что канал развивается!
Спасибо! Этот год будет довольно бодрый для проекта.
Впервые смотрю рекламу от начала до конца, не перематывая ((: И кстати батлу быть!
Спасибо за выпуск! И было бы интересно послушать про обработку ошибок
Что именно про обработку ошибок хочется услышать?
@@AndroidBroadcast ты говорил про холивар, как лучше сделать - валить приложение или обрабатывать всё подряд
Принято
Я так и делал, даже не думал что это проблема)
Кирилл, большое тебе спасибо за твои видео и телеграм каналы! Очень много полезной инфы.
Было бы круто, если бы ты записал отдельное видео про свою библиотеку ViewBindingPropertyDelegate (примеры использования, когда лучше использовать с рефлексией, а когда без, новые фишки 1.4.0)
Спасибо за поддержку. Окей, сделаю. Это будет просто.
класс Result тоже использует самый верхний класс Throwable
в чем отличие от catch (e: Throwable)
также ловите все ошибки которы могут быть
Так суть Result и есть обернуть исключения и избавиться от необходимости писать try ... catch
А как лучше обрабатывать ошибки бизнес-процесса? Например, часто такие ошибки отдают в формате errorCode и errorMessage, которые также должны обрабатываться по месту вызова. Если мы получаем условно статус код 400, мы должны попытаться сделать конвертацию этого ответа в стандартный формат ошибки бизнес-процесса и положить в кастомный BusinessException этот errorCode и errorMessage, а дальше прокидывать как обычную ошибку и смотреть по месту isBusinessError она или нет?
Сталкивался с аналогичной задачей, когда сервер возвращает внутренние ошибки. Можно создать собственный подкласс Failure и его возвращать как результат выполнения операции. Надо будет модифицировать CallAdapter, чтобы он понимал Response от сервера и превращал его в бизнес ошибку.
@@AndroidBroadcast спасибо. А как еще быть, если придерживаюсь Clean Architecture, но: 1) Result.data - это DTO объект и, если я правильно понимаю, то из Repository слоя он не может быть проброшен вплоть до Presentation, а вот ошибку по идее можно прокинуть. 2) И если прокидывать, то это должен быть другой Result тогда, с другим типом Result.data. Если мне не изменяет память, то Мартин писал, что объекты для внутреннего слоя должны идти с внешнего и мапиться там? Т.е. берем трехслойку и каждый отдает свой Result со своим data объектом?
Result прокидывать можно, а вот объекты внутри него надо конвертировать. Я для этого писал специальные функции-расширения map, сегодня добавлю в репозиторий с примером.
@@AndroidBroadcast хорошо, спасибо, вечерком гляну)
Спасибо за видео!
Кирилл, красава мужик! Видео очень полезно, интересно слушать, но качество звука, лично мне не очень зашло.🙈Не планируешь петличку купить или микрофон который на стол можно поставить? Я считаю, что с хорошим микрофоном вообще конфетка будет) Спасибо!
Спасибо; По поводу звука вышел косяк. У меня есть все необходимое оборудование, надо обеспечить достаточное поглощение звука. В будущих видео все уже будет исправлено.
Картиночка стала лучше ! :)
Спасибо. Еще есть пару моментов которых надо улучшить, но новая камера + объектив оправдала надежды
А почему бы не добавить больше удобных методов к этому резалту? Я когда делал свой Result из котлиновского Result методы брал типа fold, или onSuccess, они довольно удобные
Я показал самый минимальный вариант. На практике я его наполнял функциями и дополнительными подклассами.
А зачем это нужно, если можно обернуть в стандартный Response который идет с ретрофит и поддерживается из коробки?
а как стандартный респонс обработает тебе отсутствие интернета?)
Можно в виде какого-то особеного Exception и
было бы очень полезно всем увидеть простые практики такого типа
Если предложишь темы, то будет понятно куда двигаться
@@AndroidBroadcast как пример, варианты подписок с ViewModel в самом View, Adapter. Возможно используете что-то простое но хитрое решение. Мне было бы очень интересно как и это видео. Какие-то базовые классы, абстрактные и т.д. Спасибо
@@AndroidBroadcast также интересно было бы работу с обновлениями токенов если есть какое-то решение, к примеру, после 5 минут токен протухает и надо новый)
как реализовать отправку данных, если имеется не устойчивый интернет. Пример: сеть 2G ("e" на телефоне) в поле; пользователь инициирует отправку post -> в ответ приходит timeout exception значит приложение откладывает запрос на 1 минуту и повторно стучится с post отправкой данных пока не будет "200 OK".
Как обрабатывать подобные запросы ? где пользователь нажимает 1 кнопку и а дальше само приложение решает судьбу отправки данных (данные 100% должны отправиться, когда будет подходящий интернет).
Это можно сделать через interceptor в Retrofit
если данные 100% должны отправиться, то попробуй посмотреть в сторону work manager, там можно настроить политику retry и т.д.
Не подойдёт. Там есть ограничения по частоте вызова и оно неточное. Повторять надо на уровне вызова сетевого запроса
Вот как раз на прошлой неделе писал реализацию кастомного ответа от Retrofit.
Только я в любом случае отправлял один класс(не sealed), там был code, isSuccessfull, сериализованный объект, и сериализованный объект ошибки(иногда ошибка приходила в body с кодом ошибки 4xx).
Это все было в common модуле kmm, и этот ответ должен обрабатываться(пока что) на уровне платформы. Не уверен, что sealed классы будут работать на iOS. Или будут?
sealed - это обычный абстрактный класс, у которого на уровне Kotlin есть доп. ограничения и проверки на основе их. Ни вижу проблем для запуска этого на других платформах за пределами JVM
По качеству звука: в этом видео присутствует достаточно сильное эхо, котого в прошлых видео не было.
Да, получилось не очень. В будущих видео будет лучше. Работаю над этим вопросом уже.
А с rxjava использовать не получится?
Получится без проблем, просто пример приведён для Coroutine + Retrofit
Круто. Давай еще!
Обязательно будет. Уже готовлю
А я использовал свой CoroutineExceptionHandler чтобы не писать try catch
С таким решением есть проблемы:
1. Его надо устанавливать в любой CoroutineScope
2. Если где-то упадет ошибка, то она всегда попадает в этот CoroutineExceptionHandler. Это работает неприятно, когда есть вызовы async/await
3. CoroutineExceptionHandler - не подходит для перехвата локальной ошибки, например таймаута и необходимости выполнения какой-то операции. Либо его ставить надо в любой CoroutineScope свой собственный
@@AndroidBroadcast Да, в принципе согласен, спасибо
Так зачем это? Есть же flow, там можно ловить ошибки спокойно и врапперы никакие не нужны
+ они built-in
Flow - это про реактивные асинхронные стримы. Обработка исключений них есть, но фактически это перенос кода из catch блока в catch оператор. Даже в официальной документации приводится пример через try-catch обработку исключений в Flow.
Спасибо классный видос. Смотрю твои разные видео, не сочти за грубость, но послушай произношение тех английских слов которые ты употребляешь заранее, даже в том же гугле. Джитхаб? Авито тех, каких тех?)
Говорю как всегда произношу. Как правильно GitHub произносить? АвитоТех - так согласовали и все верно
@@AndroidBroadcast на сколько я знаю гитхаб, обычно использую если на скорую руку гугловский переводчик, быстро может подсказать как произносится)
@@AndroidBroadcast добавлю слова, которые мне резали слух и их проавильное произношение:
checked чект
unchecked анчект
failure фейлиа
suspend саспенд
Принято. Послежу за произношением
Раз пошла такая пьянка, режь последний огурец. Недавно Кирилла собеседовал Гладков и очень много заполнения пустоты звуком ааа не делайте так никто особенно ПО и ПМ, лиды мы вас слушаем и не надо этих ааа эээээ иииии и подобных для заполнения пустоты, думайте молча. Так же хочу заметить, что соответственно практически грубо говоря исходя из этого можно полностью убирать из роликов иииии речи.
Видимо, это для продвинутых разработчиков!) не понял как строится класс result и resultFactory
Может у Вас есть видео для чайников где описывается каждая строчка?)
Этот не планировался как контент для чайников, да и канал в целом для разработчиков, которые умеют создавать приложения
Понятно!
Не хочется портить красивую цифру в 69 комментариев, но -- спасибо огромноео за это видео.
Чем больше тем лучше!
На джаве поддерживаю старый проект, новый на котлине
Хз как по мне стандартное решение) единственный совет есть в котлине класс Result он почти такой же.
Не такой же, он не содержит специфичных ошибок и он inline. Там нельзя обернуть более 1 значения и есть тонкости по работе.
крутая заставка, полезный контент, но звук гавно, но т.к. звук уже пофикшен, то все шикарно
Над звуком ещё работаю. Заказал петличку и уже показался в настройках. Станет лучше, дайте время. Я многому ещё учусь в производстве видео.