Найти тему
Подключите премиум‑подпискуЭксклюзивные публикации
Корутины vs потоки
Мы все знаем, что когда-то давно единственным способом выполнять что-то в фоне были потоки. Но затем появились корутины и все многие стали использовать их. Почему же так произошло? Поток (Thread) — это отдельный путь выполнения кода, который работает параллельно с другими потоками под контролем операционной системы. Каждый поток: 📌 Потоки управляются операционной системой (ОС), а не Kotlin. Пример с потоками Представим, что у нас есть 5 котиков-курьеров, и каждому дали задание по доставке посылки...
1 неделю назад
Что такое DNS и зачем нам про это знать?
Представим, что мы набираем в браузере kotiki.com. Визуально мы просто ожидаем увидеть открытие сайта, но под капотом система должна сначала разобраться, на какой реальный сервер отправить запрос и где эти котики живут. Проблема в том, что сервера находят по IP-адресам, а не по имени kotiki.com. DNS — это и есть тот волшебник, который даёт ответ на вопрос: “По какому IP-адресу мне найти kotiki.com?”. DNS расшифровывается как Domain Name System. И это такая глобальная система, которая помогает нам переводить “человеческие” адреса (например, kotiki...
1 месяц назад
Пул соединений в Retrofit и OkHttp: как это работает и зачем нужно
Сегодня посмотрим очень интересную тему. Когда наше приложение загружает список котиков с сервера, оно делает множество сетевых запросов. И при каждом открытии и закрытии новых соединений тратится время и ресурсы устройства. OkHttp улучшает этот момент с помощью пула соединений. Вместо того чтобы для каждого запроса открывать новое соединение, OkHttp создает пул и повторно использует уже открытые соединения. В OkHttp пул соединений управляется автоматически. По умолчанию для каждого хоста поддерживается...
2 месяца назад
Exclusive внутри транзакции: что это и зачем
Скорее всего, если вы работали с базами данных и транзакциями, то замечали в коде transaction(exclusive = true). Сегодня как раз разберёмся, а что же это за exclusive. Представим, что у нас много-много-много котиков. Мы хотим их покормить, но при этом важно, чтобы никто другой в это время не кормил их. А то котики могут стать слишком толстыми и нездоровыми. Чтобы этого не произошло мы говорим всем: "Сейчас я кормлю котиков, и пока я это делаю, никто другой не может ни кормить, ни даже заглядывать в миски...
3 месяца назад
Data object внутри sealed class
Думаю, многие уже подняли версию котлин и обнаружили там data object внутри sealed class (ещё год назад). Я сделала это совсем недавно, поэтому давайте сейчас разберемся, что это такое, зачем он нужен, и чем отличается от обычного object. Напомню, что data class — это такие классы, которые автоматически генерируют equals(), hashCode() и toString(), чтобы они сразу зависели от состояния нашего котика (изменится возраст - изменятся результаты методов). А теперь представьте себе нечто подобное, но и для объектов...
116 читали · 4 месяца назад
Тестируем Koin: checkModules vs verifyAll
Недавно мне стало интересно, как протестировать Koin, чтобы убедиться, что он правильно инициализируется и не вызывает проблем в рантайме. Первая же ссылка в Яндексе привела меня к документации, где описаны два метода: checkModules и verifyAll. Давайте разберёмся, в чём разница между ними и когда какой метод использовать. Этот метод проверяет, что все зависимости, указанные в модулях, могут быть найдены и правильно созданы. Он не создаёт реальные объекты, а просто проверяет, что всё у нас указано и найдено...
6 месяцев назад
Аннотация @JvmStatic в Kotlin
Наверное, многие из нас видели в коде аннотацию @JvmStatic и выглядит так, что она достаточно простая. Аннотация помогает сделать методы и свойства статическими в контексте Java. Казалось бы, а что еще тут говорить? Я тоже так думала, а набралось на целую статью. Когда мы пишем код на Kotlin, наши котики классы и объекты по умолчанию не имеют статических методов или свойств, как это принято в Java. Вместо этого Kotlin предлагает нам использовать companion objects. Однако, иногда нам нужно, чтобы методы и свойства выглядели статическими для кода на Java...
107 читали · 7 месяцев назад
Разница между Thread.sleep() и delay
При разработке у нас часто бывает, что нужно приостановить выполнение задачи на какое-то время. Для этого можно использовать Thread.sleep() или delay. Посмотрим чем они отличаются и когда какой использовать. Это стандартный и всем известный метод, который приостанавливает выполнение текущего потока на переданное количество миллисекунд...
8 месяцев назад
Немного про Parcel и совместимость (setDataPosition)
Достаточно часто бывает ситуация, когда нам нужно передать данные между компонентами (например, между двумя активити или даже приложениями). И один из популярных способов сделать это — Parcelable. Этот интерфейс позволяет записать объекты в Parcel, который затем может быть передан между компонентами. Но есть большая проблема, что при изменении структуры данных в Parcelable могут возникнуть проблемы с совместимостью. И недавно я обнаружила метод setDataPosition. setDataPosition — это такой метод класса Parcel, который устанавливает текущую позицию чтения/записи...
8 месяцев назад
Тройные кавычки
Расскажу сегодня немного о фишке, которую многие и так знают: тройные кавычки. Внутри таких кавычек, мы можем писать текст на нескольких строках без необходимости использования символов экранирования. Например: А если не будем использовать тройные кавычки и просто сделаем с пробелами, то будет так: В целом результат похож, но нужно писать больше текста, соединять его, использовать \n. Примеры, где это особенно полезно Смотрите как удобно читать сам запрос. Ну просто красота. Например, в обычных...
9 месяцев назад
Параметризованные SQL-запросы
Делюсь с вами задачей, которую недавно встретила. Есть у нас вот такой простой запрос: Выполняем мы его через db.rawQuery(query, null) и получаем в ответ android.database.sqlite.SQLiteException: near "Artagnan": syntax error (code 1 SQLITE_ERROR): , while compiling: SELECT * FROM cats WHERE name = 'D'Artagnan'; Тут проблема в том, что catName содержит одинарную кавычку ('), которая не экранируется автоматически и конфликтует с кавычками, используемыми в самом запросе. Но почему это происходит, если...
9 месяцев назад
PhantomReference — котики, которых мы помним, но уже не видим
Представьте, что к нам в гости приходил родственник с котиком. И этот котик оставил в нашем доме игрушку. Мы знаем, что котик точно больше не в доме, но его игрушка всё ещё занимает место. Так вот "котик" — это объект, а "игрушка" — это ресурсы или память, которые объект использовал. Фантомная ссылка позволяет нам узнать, что котик (объект) ушёл и игрушку можно убрать. То есть, мы узнаем, что объект уже не используется и скоро будет окончательно удален, поэтому мы можем произвести какие-то действия (закрыть ресурсы, что-то очистить)...
10 месяцев назад