📕 KMP for Mobile Native Developers: The Book
by Santiago Mattiauda.
https://santimattius.github.io/kmp-for-mobile-native-developers-book/
✍️ @kotlin_lib
by Santiago Mattiauda.
https://santimattius.github.io/kmp-for-mobile-native-developers-book/
✍️ @kotlin_lib
👍9
1Sec Temporary Mail App (Создано с Compose Multiplatform)
1Sec Temporary Mail — это кроссплатформенное приложение на Kotlin, которое предоставляет пользователям временные адреса электронной почты, действительные всего одну секунду. С его помощью можно быстро генерировать одноразовые email-адреса и использовать их для различных целей, таких как регистрация на сайтах, получение проверочных писем или защита основного почтового ящика от спама.
https://github.com/KapilYadav-dev/1SecMail
✍️ @kotlin_lib
1Sec Temporary Mail — это кроссплатформенное приложение на Kotlin, которое предоставляет пользователям временные адреса электронной почты, действительные всего одну секунду. С его помощью можно быстро генерировать одноразовые email-адреса и использовать их для различных целей, таких как регистрация на сайтах, получение проверочных писем или защита основного почтового ящика от спама.
https://github.com/KapilYadav-dev/1SecMail
✍️ @kotlin_lib
👍3
🗓 18 февраля в 19:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional» от Otus.
На вебинаре рассмотрим:
🔗 Ссылка на регистрацию: https://vk.cc/cIwobu
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍1
Продвинутая обработка исключений в Kotlin Coroutines: руководство для Android-разработчиков
Обработка исключений в Kotlin Coroutines — это важная тема, особенно когда дело касается асинхронного программирования в Android. В статье рассматриваются следующие ключевые аспекты:
- Общая стратегия обработки исключений
Различие между
- Глобальная обработка исключений
Использование
- Обработка исключений в структурированных корутинах
Применение
- Отлов исключений в
Важно помнить, что
- Ошибка распространения исключений в
Запущенные через
https://proandroiddev.com/advanced-exception-handling-in-kotlin-coroutines-a-guide-for-android-developers-e1aede099252
✍️ @kotlin_lib
Обработка исключений в Kotlin Coroutines — это важная тема, особенно когда дело касается асинхронного программирования в Android. В статье рассматриваются следующие ключевые аспекты:
- Общая стратегия обработки исключений
Различие между
try-catch
, CoroutineExceptionHandler
и supervisorScope
. - Глобальная обработка исключений
Использование
CoroutineExceptionHandler
и его ограничение — он работает только с незахваченными исключениями. - Обработка исключений в структурированных корутинах
Применение
supervisorScope
для предотвращения отмены всей иерархии корутин. - Отлов исключений в
async
Важно помнить, что
async
возвращает Deferred
, а исключения в нем не всплывают автоматически. Их нужно ловить через await()
. - Ошибка распространения исключений в
launch
Запущенные через
launch
корутины выбрасывают исключения вверх по иерархии, что может привести к неожиданному завершению приложения. https://proandroiddev.com/advanced-exception-handling-in-kotlin-coroutines-a-guide-for-android-developers-e1aede099252
✍️ @kotlin_lib
👍3
👩💻 А ты справишься с тестом по Kotlin?
🏆 Пройди тест из 10 вопросов, проверь свой уровень знаний и получи скидку на онлайн-курс «Kotlin Backend Developer. Professional» от OTUS!
Если успешно пройдешь тест, сможешь забронировать место в группе по выгодной цене! И еще дарим промокодKotlin5
🎫 Курс можно приобрести в рассрочку
➡️ Пройти тест и забрать скидку: https://vk.cc/cIK1jj
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🏆 Пройди тест из 10 вопросов, проверь свой уровень знаний и получи скидку на онлайн-курс «Kotlin Backend Developer. Professional» от OTUS!
Если успешно пройдешь тест, сможешь забронировать место в группе по выгодной цене! И еще дарим промокод
🎫 Курс можно приобрести в рассрочку
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Принцип единственной ответственности (SRP) в Kotlin: глубокий разбор
Принцип единственной ответственности (Single Responsibility Principle, SRP) из SOLID гласит, что класс должен иметь только одну причину для изменения. В статье рассматриваются следующие важные аспекты:
- Почему SRP важен?
Код становится более читаемым, тестируемым и удобным для сопровождения.
- Признаки нарушения SRP
- Класс выполняет несколько несвязанных задач.
- Частые изменения одной части кода затрагивают другие части.
- Усложняется тестирование, так как приходится проверять несколько функциональностей сразу.
- Как применять SRP в Kotlin?
- Разделение ответственности: деление класса на несколько более мелких, каждый из которых отвечает только за свою функцию.
- Использование делегирования: передача отдельных задач вспомогательным классам.
- Функциональный подход: использование функций высшего порядка и композиции вместо огромных классов.
- Пример рефакторинга
В статье показан код, который нарушает SRP, и варианты его исправления с помощью грамотного разделения логики.
Применение SRP в Kotlin позволяет писать более чистый, поддерживаемый и расширяемый код, который легче тестировать и модифицировать.
https://itnext.io/the-single-responsibility-principle-srp-in-kotlin-deep-dive-34f478064848
✍️ @kotlin_lib
Принцип единственной ответственности (Single Responsibility Principle, SRP) из SOLID гласит, что класс должен иметь только одну причину для изменения. В статье рассматриваются следующие важные аспекты:
- Почему SRP важен?
Код становится более читаемым, тестируемым и удобным для сопровождения.
- Признаки нарушения SRP
- Класс выполняет несколько несвязанных задач.
- Частые изменения одной части кода затрагивают другие части.
- Усложняется тестирование, так как приходится проверять несколько функциональностей сразу.
- Как применять SRP в Kotlin?
- Разделение ответственности: деление класса на несколько более мелких, каждый из которых отвечает только за свою функцию.
- Использование делегирования: передача отдельных задач вспомогательным классам.
- Функциональный подход: использование функций высшего порядка и композиции вместо огромных классов.
- Пример рефакторинга
В статье показан код, который нарушает SRP, и варианты его исправления с помощью грамотного разделения логики.
Применение SRP в Kotlin позволяет писать более чистый, поддерживаемый и расширяемый код, который легче тестировать и модифицировать.
https://itnext.io/the-single-responsibility-principle-srp-in-kotlin-deep-dive-34f478064848
✍️ @kotlin_lib
👍2
Вот отсортированная база с тонной материала (постепенно пополняется):
БАЗА (4687 видео/книг):
(363 видео, 87 книги) — Python
(415 видео, 68 книги) — Frontend
(143 видео, 33 книги) — ИБ/Хакинг
(352 видео, 89 книги) — С/С++
(343 видео, 87 книги) — Java
(176 видео, 32 книги) — Git
(293 видео, 63 книги) — C#
(174 видео, 91 книги) — DevOps
(167 видео, 53 книги) — PHP
(227 видео, 83 книги) — SQL/БД
(163 видео, 29 книги) — Linux
(114 видео, 77 книги) — Сисадмин
(107 видео, 43 книги) — BA/SA
(181 видео, 32 книги) — Go
(167 видео, 43 книги) — Kotlin/Swift
(112 видео, 24 книги) — Flutter
(137 видео, 93 книги) — DS/ML
(113 видео, 82 книги) — GameDev
(183 видео, 37 книги) — Дизайн
(129 видео, 73 книги) — QA
(213 видео, 63 книги) — Rust
(121 видео, 24 книги) — 1С
(136 видео, 33 книги) — PM/HR
Скачивать ничего не нужно — все выложили в Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
💩8🔥1
Пошаговое руководство по выполнению анализа данных с помощью Kotlin DataFrame
Это первая из серии обучающих статей о том, как легко манипулировать и визуализировать данные с помощью библиотек Kotlin DataFrame и Kandy. Эти уроки предназначены для обычных разработчиков на Kotlin, поэтому предыдущий опыт в области анализа данных или работы с аналогичными фреймворками (например, pandas или Apache Spark) не требуется. Однако, вы должны быть знакомы с языком Kotlin и ранее создавать проекты на Kotlin в IntelliJ IDEA.
https://blog.jetbrains.com/kotlin/2024/04/a-step-by-step-guide-to-performing-data-analysis-with-kotlin-dataframe/
✍️ @kotlin_lib
Это первая из серии обучающих статей о том, как легко манипулировать и визуализировать данные с помощью библиотек Kotlin DataFrame и Kandy. Эти уроки предназначены для обычных разработчиков на Kotlin, поэтому предыдущий опыт в области анализа данных или работы с аналогичными фреймворками (например, pandas или Apache Spark) не требуется. Однако, вы должны быть знакомы с языком Kotlin и ранее создавать проекты на Kotlin в IntelliJ IDEA.
https://blog.jetbrains.com/kotlin/2024/04/a-step-by-step-guide-to-performing-data-analysis-with-kotlin-dataframe/
✍️ @kotlin_lib
👍5
😴 Ваши Android-приложения «умирают» в фоне, а как пользоваться сервисами непонятно?
✨ Разбираем фоновые процессы на открытом вебинаре!
– Узнаем, какие ограничения Google накладывает на работу приложений в фоновом режиме и как с этим бороться.
– Разберём все актуальные методы.
🚀 Освойте лучшие практики фоновой работы, чтобы создавать эффективные и отзывчивые Android-приложения. А ещё получите 🎁скидку на обучение «Android Developer. Professional»!
📅 Встречаемся 26 февраля в 20:00 мск!
👉 Регистрация открыта: https://vk.cc/cISnPc
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
✨ Разбираем фоновые процессы на открытом вебинаре!
– Узнаем, какие ограничения Google накладывает на работу приложений в фоновом режиме и как с этим бороться.
– Разберём все актуальные методы.
🚀 Освойте лучшие практики фоновой работы, чтобы создавать эффективные и отзывчивые Android-приложения. А ещё получите 🎁скидку на обучение «Android Developer. Professional»!
📅 Встречаемся 26 февраля в 20:00 мск!
👉 Регистрация открыта: https://vk.cc/cISnPc
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍2❤1
Media is too big
VIEW IN TELEGRAM
Непростые вопросы про Kotlin Coroutines
Александр Гирев
Однажды пятничным вечером Александр и его коллега задумались над вопросом: где живут корутины, когда запустивший их coroutineScope героически погибает в жерновах GC? Субботнее утро было проведено за чтением статей и исходников.
Вот так и родилась идея доклада. В нем — ответы на вопросы об устройстве и работе корутин для самых любознательных.
Материал доклада рассчитан на участников, которые знакомы как минимум с теоретическими основами Kotlin Coroutines.
источник
✍️ @kotlin_lib
Александр Гирев
Однажды пятничным вечером Александр и его коллега задумались над вопросом: где живут корутины, когда запустивший их coroutineScope героически погибает в жерновах GC? Субботнее утро было проведено за чтением статей и исходников.
Вот так и родилась идея доклада. В нем — ответы на вопросы об устройстве и работе корутин для самых любознательных.
Материал доклада рассчитан на участников, которые знакомы как минимум с теоретическими основами Kotlin Coroutines.
источник
✍️ @kotlin_lib
👍3
Koin Annotations 2.0: что нового?
Команда Koin выпустила Koin Annotations 2.0, значительно улучшив поддержку аннотаций для DI в Kotlin. Этот релиз нацелен на упрощение работы с Koin и упрощение интеграции аннотаций с компиляторным плагином KSP.
🔥 Основные изменения:
- Оптимизированный KSP-обработчик – компиляция теперь быстрее и стабильнее.
- Обновленный DSL – улучшенная поддержка модулей и более гибкие аннотации.
- Упрощенные Scopes & Qualifiers – декларативный стиль позволяет писать меньше кода.
- Новый механизм Inject – еще более удобный способ внедрения зависимостей.
Этот релиз делает DI с Koin еще проще, позволяя писать меньше кода и получать максимум производительности. Если используешь Koin – обязательно обновись!
https://blog.insert-koin.io/koin-annotations-2-0-release-is-out-445c27a569b9
✍️ @kotlin_lib
Команда Koin выпустила Koin Annotations 2.0, значительно улучшив поддержку аннотаций для DI в Kotlin. Этот релиз нацелен на упрощение работы с Koin и упрощение интеграции аннотаций с компиляторным плагином KSP.
🔥 Основные изменения:
- Оптимизированный KSP-обработчик – компиляция теперь быстрее и стабильнее.
- Обновленный DSL – улучшенная поддержка модулей и более гибкие аннотации.
- Упрощенные Scopes & Qualifiers – декларативный стиль позволяет писать меньше кода.
- Новый механизм Inject – еще более удобный способ внедрения зависимостей.
Этот релиз делает DI с Koin еще проще, позволяя писать меньше кода и получать максимум производительности. Если используешь Koin – обязательно обновись!
https://blog.insert-koin.io/koin-annotations-2-0-release-is-out-445c27a569b9
✍️ @kotlin_lib
👍5
Ko-iso
Это репозиторий ko-iso, который предоставляет ISO-коды стран и регионов в виде Kotlin-библиотеки. Полезен для работы с международными стандартами, например, при обработке страновых кодов в приложениях. Поддерживает ISO 3166-1 (страны) и 3166-2 (регионы).
https://github.com/jillesvangurp/ko-iso
✍️ @kotlin_lib
Это репозиторий ko-iso, который предоставляет ISO-коды стран и регионов в виде Kotlin-библиотеки. Полезен для работы с международными стандартами, например, при обработке страновых кодов в приложениях. Поддерживает ISO 3166-1 (страны) и 3166-2 (регионы).
https://github.com/jillesvangurp/ko-iso
✍️ @kotlin_lib
👍8
moko-resources — это библиотека для управления ресурсами (строки, изображения, цвета и т.д.) в Kotlin Multiplatform проекте. Она позволяет использовать ресурсы из общего кода
Основные возможности:
- Доступ к ресурсам из
- Поддержка string, string formatting, plurals, colors, images
- Генерация кода на основе
- Поддержка Android, iOS, desktop (JetBrains Compose)
Пример использования:
Поддержка платформ:
- ✅ Android
- ✅ iOS
- ✅ Desktop (Compose Multiplatform)
https://github.com/icerockdev/moko-resources
✍️ @kotlin_lib
commonMain
.Основные возможности:
- Доступ к ресурсам из
commonMain
- Поддержка string, string formatting, plurals, colors, images
- Генерация кода на основе
.xml/.strings
файлов- Поддержка Android, iOS, desktop (JetBrains Compose)
Пример использования:
val str = MR.strings.some_string.desc()
textView.text = str.localized()
Поддержка платформ:
- ✅ Android
- ✅ iOS
- ✅ Desktop (Compose Multiplatform)
https://github.com/icerockdev/moko-resources
✍️ @kotlin_lib
👍5
Открытие браузера по умолчанию на разных платформах
Иногда приложение должно открыть веб-страницу в браузере по умолчанию. Хотя это кажется простой задачей, реализация может различаться в зависимости от платформы. Давайте посмотрим, как справиться с этим в разных средах.
Kotlin Multiplatform
В многоплатформенных проектах (например, с использованием Kotlin Multiplatform) приходится учитывать реализацию для каждой целевой платформы. Один из подходов — использовать ожидания/реализации (
https://dev.to/tkuenneth/open-the-default-browser-across-platforms-3cbh
✍️ @kotlin_lib
Иногда приложение должно открыть веб-страницу в браузере по умолчанию. Хотя это кажется простой задачей, реализация может различаться в зависимости от платформы. Давайте посмотрим, как справиться с этим в разных средах.
Kotlin Multiplatform
В многоплатформенных проектах (например, с использованием Kotlin Multiplatform) приходится учитывать реализацию для каждой целевой платформы. Один из подходов — использовать ожидания/реализации (
expect/actual
), чтобы объявить функцию в общем коде и реализовать её отдельно для каждой платформы.https://dev.to/tkuenneth/open-the-default-browser-across-platforms-3cbh
✍️ @kotlin_lib
👍2
🧵 Kotlin Coroutines без макияжа: что скрывается под капотом
Когда вы запускаете корутину с помощью
🔄 Жизненный цикл корутины:
1. Создание — с помощью
2. Запуск — автоматически или через
3. Приостановка — при вызове
4. Возобновление — после завершения асинхронной операции.
5. Завершение — когда весь код выполнен или корутина отменена.
🧠 Что такое
📌 Пример:
Компилятор преобразует этот код в класс, который можно представить следующим образом:
Здесь
https://habr.com/ru/articles/882988/
✍️ @kotlin_lib
Когда вы запускаете корутину с помощью
launch
или async
, компилятор Kotlin создаёт специальный объект, реализующий интерфейс Continuation
. Этот объект содержит состояние выполнения корутины и позволяет ей приостанавливаться и возобновляться. Внутри него хранятся все локальные переменные и текущая точка выполнения.🔄 Жизненный цикл корутины:
1. Создание — с помощью
launch
или async
.2. Запуск — автоматически или через
start()
.3. Приостановка — при вызове
suspend
-функций, таких как delay()
или await()
.4. Возобновление — после завершения асинхронной операции.
5. Завершение — когда весь код выполнен или корутина отменена.
🧠 Что такое
Continuation
?Continuation
— это объект, представляющий состояние выполнения корутины. Он позволяет приостанавливать и возобновлять выполнение, сохраняя информацию о том, где именно корутина была приостановлена. Интерфейс Continuation
выглядит следующим образом:
interface Continuation<in T> {
val context: CoroutineContext
fun resumeWith(result: Result<T>)
}
📌 Пример:
suspend fun mySuspendFunction() {
println("Start")
delay(1000)
println("End")
}
launch {
mySuspendFunction()
}
Компилятор преобразует этот код в класс, который можно представить следующим образом:
class GeneratedContinuation extends SuspendLambda {
int label;
@Override
Object invokeSuspend(Object result) {
switch (label) {
case 0:
println("Start");
label = 1;
if (delay(1000, this) == COROUTINE_SUSPENDED)
return COROUTINE_SUSPENDED;
case 1:
println("End");
return Unit.INSTANCE;
}
throw new IllegalStateException();
}
}
Здесь
label
указывает на текущую точку выполнения внутри корутины. При каждом вызове suspend
-функции значение label
изменяется, чтобы указать, с какого места нужно продолжить выполнение после приостановки.https://habr.com/ru/articles/882988/
✍️ @kotlin_lib
👍5
Плавная миграция на Kotlin 2.1.0
Всем привет, меня зовут Эдуард, я Android Tech Lead в QIC digital hub[ссылка удалена мод.]. Сегодня я расскажу как совершить плавный переход на Kotlin 2.1.0, руководствуясь опытом своей команды.
https://habr.com/ru/articles/898048/
✍️ @kotlin_lib
Всем привет, меня зовут Эдуард, я Android Tech Lead в QIC digital hub[ссылка удалена мод.]. Сегодня я расскажу как совершить плавный переход на Kotlin 2.1.0, руководствуясь опытом своей команды.
https://habr.com/ru/articles/898048/
✍️ @kotlin_lib
👍1
💻Хотите научиться писать эффективные сетевые клиенты для iOS и разобраться в том, какие технологии лучше выбрать для SwiftUI?
📖На открытом вебинаре 22 апреля в 20:00 мск мы подробно разберем архитектуру приложений на SwiftUI и выбор сетевого клиента: что лучше — Alamofire, Moya или нативное решение? Мы также покажем, как интегрировать эти технологии с Combine и async-await.
📊Умение работать с сетевыми клиентами под SwiftUI — ключевой навык для iOS-разработчика.
👉Регистрируйтесь прямо сейчас и получите скидку на большое обучение «iOS Developer. Professional» по промокоду IOSPRO4: https://vk.cc/cKRMfx
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
📖На открытом вебинаре 22 апреля в 20:00 мск мы подробно разберем архитектуру приложений на SwiftUI и выбор сетевого клиента: что лучше — Alamofire, Moya или нативное решение? Мы также покажем, как интегрировать эти технологии с Combine и async-await.
📊Умение работать с сетевыми клиентами под SwiftUI — ключевой навык для iOS-разработчика.
👉Регистрируйтесь прямо сейчас и получите скидку на большое обучение «iOS Developer. Professional» по промокоду IOSPRO4: https://vk.cc/cKRMfx
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍1
🧨 equals()
в Kotlin: незаметная ловушка, которая бьёт по бизнес-логикеКогда
equals()
работает не так, как ты думаешь — начинается отладочный ад. Особенно, если ты используешь data class
и полагаешься на их auto-generated equals.Представь кейс: ты получаешь DTO из API и кладёшь его в
Set
, надеясь, что дубликаты не появятся. Но через минуту замечаешь, что одинаковые по сути объекты спокойно живут рядом. Почему?📌 Типичная ошибка — включать в
equals()/hashCode()
поля, которые не участвуют в "бизнесовой" идентичности объекта. Например:
data class Product(
val id: String,
val name: String,
val lastUpdated: Long // техническое поле
)
Добавь два продукта с одинаковым
id
, но разным lastUpdated
— и Set посчитает их разными.equals()
и hashCode()
, вручную указав, какие поля важны:
data class Product(
val id: String,
val name: String,
val lastUpdated: Long
) {
override fun equals(other: Any?) =
other is Product && other.id == id
override fun hashCode() = id.hashCode()
}
🔥 Если используешь
copy()
— помни, что он тащит все поля. И если ты потом сравниваешь объекты по equals()
, может случиться сюрприз.✅ Вывод: auto-generated
equals()
удобен, но не всегда безопасен. Если объект участвует в коллекциях, кэшах или логике сравнения — контролируй его равенство вручную.✍️ @kotlin_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
Объяснение отмены корутин в Kotlin
Kotlin корутины предоставляют удобный способ асинхронного программирования. Но с этим удобством приходит и необходимость понять, как работает отмена. Давайте разберемся, как именно происходит отмена корутин и что это означает для вашего кода.
Что происходит при отмене?
Когда
- Вызов
- Явная проверка
Пример:
Если вы вызовете
Отмена и finally
Пример отмены
Вывод:
Как видно,
Заключение
Понимание механизма отмены корутин — важная часть работы с асинхронным кодом в Kotlin. Отмена не означает мгновенное завершение — корутина завершится в точке отмены. Используйте
https://sam-cooper.medium.com/kotlin-coroutine-cancellation-explained-6a545c8da252
✍️ @kotlin_lib
Kotlin корутины предоставляют удобный способ асинхронного программирования. Но с этим удобством приходит и необходимость понять, как работает отмена. Давайте разберемся, как именно происходит отмена корутин и что это означает для вашего кода.
Что происходит при отмене?
Когда
Job
отменяется, он переводится в состояние "отменено", но фактически корутина не завершится мгновенно. Она завершится, когда достигнет "точки отмены" (cancellation point). Это может быть:- Вызов
delay
, yield
и других suspend-функций, проверяющих isActive
.- Явная проверка
coroutineContext.isActive
или вызов ensureActive()
.Пример:
launch {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
Если вы вызовете
cancel()
на этой корутине, она остановится только после следующего delay
.Отмена и finally
try/finally
блоки работают в корутинах, как и ожидалось. Однако, если вы используете delay
или другую suspend-функцию в finally
, она тоже может быть отменена. Чтобы избежать этого, используйте withContext(NonCancellable)
:
try {
// работа
} finally {
withContext(NonCancellable) {
// гарантированно выполнится
}
}
Пример отмены
val job = launch {
try {
repeat(1000) { i ->
println("Job: I'm sleeping $i ...")
delay(500L)
}
} finally {
println("Job: I'm running finally")
}
}
delay(1300L) // немного подождем
println("main: I'm tired of waiting!")
job.cancelAndJoin() // отмена и ожидание завершения
println("main: Now I can quit.")
Вывод:
Job: I'm sleeping 0 ...
Job: I'm sleeping 1 ...
Job: I'm sleeping 2 ...
main: I'm tired of waiting!
Job: I'm running finally
main: Now I can quit.
Как видно,
finally
выполнится при отмене, но если в нем будет suspend-функция — нужно быть осторожным.Заключение
Понимание механизма отмены корутин — важная часть работы с асинхронным кодом в Kotlin. Отмена не означает мгновенное завершение — корутина завершится в точке отмены. Используйте
NonCancellable
, если нужно завершить работу "честно", несмотря на отмену.https://sam-cooper.medium.com/kotlin-coroutine-cancellation-explained-6a545c8da252
✍️ @kotlin_lib
👍3
На открытом уроке «Облако в кармане: запускаем всю инфраструктуру для теста при сборке» от OTUS мы расскажем, как избежать ручных настроек и запусков. Вместо этого вы научитесь автоматизировать весь процесс с помощью Docker, DockerCompose и TestContainers, интегрируя их с Gradle.
Урок полезен для разработчиков на Kotlin и Java, которые работают с автотестами — интеграционными и end-to-end.
В ходе урока вы освоите:
▫️Автоматический запуск всей необходимой инфраструктуры для тестирования.
▫️Создание Docker-образов для тестов и деплоя.
▫️Разработку автотестов, которые поднимут ваши навыки на новый уровень.
Участники получат скидку на курс «Kotlin Backend Developer. Professional».
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1