Найти в Дзене
Поддержите автораПеревод на любую сумму
Подключите ПремиумЭксклюзивные публикации
🐾 uses-permission vs permission 🐾
Когда мы открываем AndroidManifest, там можно встретить два разрешения: и На вид они почти одинаковые, и многие разработчики на старте путаются (да и не на старте). Но на самом деле — это очень разные сущности, и живут они на разных этажах Android-вселенной. <uses-permission> — это равносильно словам: «Привет! Моё приложение хочет использовать вот это разрешение». Пример: котик хочет выйти на улицу (доступ в интернет): <uses-permission android:name="android.permission.INTERNET" /> Важно: uses-permission ничего не создаёт...
2 недели назад
copy() в дата классе
Когда мы создаём data class Cat(val name: String, val mood: String) kotlin автоматически добавляет в него метод copy(), который: Метод copy() для нашего котика выглядит примерно так: fun copy(name: String = this.name, mood: String = this.mood): Cat { return Cat(name, mood) } То есть мы можем поменять одно поле, а остальные останутся как в исходном объекте. copy() делает поверхностную копию. Это значит: Тут видно, что copy() не делает глубокую копию...
1 месяц назад
🐾 "apply", "also", "run", "let", "with" — зачем нам всё это?
Сегодня разберём "любимую" тему всех разработчиков — scope-функции. Таких функций вроде бы много, все похожи, но на самом деле у каждой есть своя роль — как у игрушек у котика. Мячик — чтобы гонять, коробка — чтобы сидеть, мышка — чтобы охотиться. Так же и с apply, also, run, let, with. Scope-функции — это такие функции, которые позволяют выполнить блок кода в контексте объекта. Они помогают: А теперь человеческим языком. Представим, что у нас есть котик по имени Барсик. И мы хотим: Вот scope-функции как раз нужны, чтобы не писать “Барсик...
3 месяца назад
Корутины vs потоки
Мы все знаем, что когда-то давно единственным способом выполнять что-то в фоне были потоки. Но затем появились корутины и все многие стали использовать их. Почему же так произошло? Поток (Thread) — это отдельный путь выполнения кода, который работает параллельно с другими потоками под контролем операционной системы. Каждый поток: 📌 Потоки управляются операционной системой (ОС), а не Kotlin. Пример с потоками Представим, что у нас есть 5 котиков-курьеров, и каждому дали задание по доставке посылки...
138 читали · 5 месяцев назад
Что такое DNS и зачем нам про это знать?
Представим, что мы набираем в браузере kotiki.com. Визуально мы просто ожидаем увидеть открытие сайта, но под капотом система должна сначала разобраться, на какой реальный сервер отправить запрос и где эти котики живут. Проблема в том, что сервера находят по IP-адресам, а не по имени kotiki.com. DNS — это и есть тот волшебник, который даёт ответ на вопрос: “По какому IP-адресу мне найти kotiki.com?”. DNS расшифровывается как Domain Name System. И это такая глобальная система, которая помогает нам переводить “человеческие” адреса (например, kotiki...
7 месяцев назад
Пул соединений в Retrofit и OkHttp: как это работает и зачем нужно
Сегодня посмотрим очень интересную тему. Когда наше приложение загружает список котиков с сервера, оно делает множество сетевых запросов. И при каждом открытии и закрытии новых соединений тратится время и ресурсы устройства. OkHttp улучшает этот момент с помощью пула соединений. Вместо того чтобы для каждого запроса открывать новое соединение, OkHttp создает пул и повторно использует уже открытые соединения. В OkHttp пул соединений управляется автоматически. По умолчанию для каждого хоста поддерживается...
7 месяцев назад
Exclusive внутри транзакции: что это и зачем
Скорее всего, если вы работали с базами данных и транзакциями, то замечали в коде transaction(exclusive = true). Сегодня как раз разберёмся, а что же это за exclusive. Представим, что у нас много-много-много котиков. Мы хотим их покормить, но при этом важно, чтобы никто другой в это время не кормил их. А то котики могут стать слишком толстыми и нездоровыми. Чтобы этого не произошло мы говорим всем: "Сейчас я кормлю котиков, и пока я это делаю, никто другой не может ни кормить, ни даже заглядывать в миски...
9 месяцев назад
Data object внутри sealed class
Думаю, многие уже подняли версию котлин и обнаружили там data object внутри sealed class (ещё год назад). Я сделала это совсем недавно, поэтому давайте сейчас разберемся, что это такое, зачем он нужен, и чем отличается от обычного object. Напомню, что data class — это такие классы, которые автоматически генерируют equals(), hashCode() и toString(), чтобы они сразу зависели от состояния нашего котика (изменится возраст - изменятся результаты методов). А теперь представьте себе нечто подобное, но и для объектов...
139 читали · 10 месяцев назад
Тестируем Koin: checkModules vs verifyAll
Недавно мне стало интересно, как протестировать Koin, чтобы убедиться, что он правильно инициализируется и не вызывает проблем в рантайме. Первая же ссылка в Яндексе привела меня к документации, где описаны два метода: checkModules и verifyAll. Давайте разберёмся, в чём разница между ними и когда какой метод использовать. Этот метод проверяет, что все зависимости, указанные в модулях, могут быть найдены и правильно созданы. Он не создаёт реальные объекты, а просто проверяет, что всё у нас указано и найдено...
11 месяцев назад
Аннотация @JvmStatic в Kotlin
Наверное, многие из нас видели в коде аннотацию @JvmStatic и выглядит так, что она достаточно простая. Аннотация помогает сделать методы и свойства статическими в контексте Java. Казалось бы, а что еще тут говорить? Я тоже так думала, а набралось на целую статью. Когда мы пишем код на Kotlin, наши котики классы и объекты по умолчанию не имеют статических методов или свойств, как это принято в Java. Вместо этого Kotlin предлагает нам использовать companion objects. Однако, иногда нам нужно, чтобы методы и свойства выглядели статическими для кода на Java...
118 читали · 1 год назад
Разница между Thread.sleep() и delay
При разработке у нас часто бывает, что нужно приостановить выполнение задачи на какое-то время. Для этого можно использовать Thread.sleep() или delay. Посмотрим чем они отличаются и когда какой использовать. Это стандартный и всем известный метод, который приостанавливает выполнение текущего потока на переданное количество миллисекунд...
104 читали · 1 год назад
Немного про Parcel и совместимость (setDataPosition)
Достаточно часто бывает ситуация, когда нам нужно передать данные между компонентами (например, между двумя активити или даже приложениями). И один из популярных способов сделать это — Parcelable. Этот интерфейс позволяет записать объекты в Parcel, который затем может быть передан между компонентами. Но есть большая проблема, что при изменении структуры данных в Parcelable могут возникнуть проблемы с совместимостью. И недавно я обнаружила метод setDataPosition. setDataPosition — это такой метод класса Parcel, который устанавливает текущую позицию чтения/записи...
1 год назад