💻 Что такое Kotlin Channel?
При использовании корутин в Kotlin рано или поздно появляется вопрос о том, какие примитивы необходимо использовать для передачи потоков данных между несколькими корутинами.
Для этого в библиотеке kotlinx.coroutines
имеется специальный механизм, который так и называется — Channel
.
▶️ Посмотрим на него поподробнее
@android_its
💻 Статические методы и синхронизация в Котлин
На собеседовании может всплыть вопрос в духе: "Что будет являться монитором для блока кода, помеченного сразу двумя аннотациями @Synchronized
и @JvmStatic
в Котлин?".
Держите полезную статью, в которой рассматривается, для чего используются данные аннотации и каким будет результат при их одновременном использовании.
А пока немного о @Synchronized
и @JvmStatic
:
🟡Аннотация @Synchronized
в Kotlin является аннотацией для методов и блоков кода, которая обеспечивает синхронизацию доступа к ним между потоками. Когда метод или блок кода помечены аннотацией @Synchronized
, только один поток может получить право их выполнения в определенный момент времени, остальные потоки будут ожидать освобождения монитора, прежде чем получить доступ. Это позволяет избежать состояния гонки и обеспечить правильное выполнение кода в многопоточной среде.
🟡Аннотация @JvmStatic
в Kotlin указывает компилятору, что функция или свойство должны быть статическими в Java-коде после компиляции. Когда мы используем @JvmStatic
перед функцией или свойством в объекте- компаньоне или внутри объекта, компилятор Kotlin создает соответствующий статический элемент в Java-коде. Это позволяет вызывать этот элемент напрямую из Java-кода, без необходимости ссылаться на экземпляр класса или объекта.
📎 Статья
@android_its
📱 Android-приложение для демонстрации работы основных функций SDK на Kotlin
Отличная идея для пет-проекта;
описание возможностей приложения:
• Инициализация платежа
• Отмена платежа
• Возврат платежа
• Проведение клиринга
• Проведение рекуррентного платежа
• Получение информации/статуса платежа
• Добавление карт/Удаление карт
• Оплата добавленными картами
• Безакцептные платежи
• Создание платежа с Google Pay
🖥 GitHub
@android_its
💻 RecyclerView — реализация прослушивателя щелчка по элементу в Android Studio
Держите годный пошаговый гайд по созданию RecyclerView на Kotlin в Android Studio.
План туториала:
├╼
Создание базового шаблона элемента
├╼
Реализация адаптера для ресайклью
├╼
Реализация ресайклью и переход на новую активити
├╼
Создание элемента в ресайквью
├╼
Обработка клика
├╼
Создание инфо элемента
╰╼
Реализация клика
📎 Ссылка
@android_its
Пишете на Swift под iOS? Или на Java/Kotlin под Android? Для вас есть работа в Тинькофф.
18 и 19 мая пройдет Mobile Weekend Offer для разработчиков с опытом от 3 лет. Так можно попасть в команду еще быстрее: пройти все этапы собеседования за выходные и получить оффер на неделе.
Если устроитесь, будете решать сложные финтех-задачи, развивать продукты для миллионов и расти в сильной команде. Топовый стек, достойная оплата и ДМС со стоматологией тоже будут.
Проверьте свои силы — оставьте заявку до 15 мая
АО «Тинькофф Банк», ИНН 7710140679
💻 Как создать свой View в Android Studio + Kotlin (XML)
Отличное видео о том, как работать с View
в Android Studio.
Самое то, для тех, кто только вливается в эту тему
Что внутри?
• Создание кастомного View
• Рисование примитивных фигур
• Работа с системой координат
• Рисование круга с помощью Canvas
• Настройка координат и цвета
• Использование Style
для настройки цвета
📎 Кликабельный план
📎 YouTube
@android_its
💻 Запуск Kotlin кода без IDE
▶️Итак, вопрос: как скомпилировать простенький код написанный на Kotlin без IDE?
▶️Вот пошаговая инструкция:
⏩1. Загрузить компилятор. Найти последнюю версию можно здесь.
⏩2. Распаковать компилятор в отдельную папку, добавить bin
директорию в переменную окружения PATH
. Об этом можно почитать тут. Bin
содержит скрипты, необходимые для сборки и запуска кода на Windows, OS X и Linux.
Другой вариант установки компилятора: для OS X, Linux, Cygwin, FreeBSD или Solaris (возможно, и другие UNIX-системы), то можно использовать SDKMAN https://sdkman.io/.
Запускаем в терминале:
$ curl -s https://get.sdkman.io | bash
$ sdk install kotlin
fun main(args: Array<String>) {
println("Hello, World!")
}
$ kotlinc hello.kt -include-runtime -d hello.jar
$ kotlinc -help
$ java -jar hello.jar
📱 Интересная статья о написании профайлера для анализа Android-приложения с помощью Kotlin
Некоторые мысли из статьи, и о чём вообще в ней речь:
⏩Аудит приложения важен для выявления неявных деградаций в производительности.
⏩Написанный профайлер обладает рядом плюсов, таких как минимальное негативное влияние на производительность и гибкость в сборе метрик.
⏩Существующие инструменты Android Profile, Battery Historian и Systrace имеют свои минусы.
⏩В частности, Android Profiler имеет наглядные графики и обширный функционал, но у него отсутствует гибкость в сборке метрик.
⏩Systrace позволяет собирать и инспектировать время работы частей кода по всем процессам на девайсе.
⏩Battery Historian нужен для получения дополнительной информации по работе приложения, такой как процент потребления батарейки и условия, влияющие на потребление.
⏩В статье представлены коды для фиксации значений потребления CPU, памяти, сети и потребления батареи.
⏩Кастомное решение имеет ряд преимуществ по отношению к Android Profiler, включая отсутствие крашей, замедлений приложения и гибкость в сборе метрик.
📎 Статья
@android_its
📱 Zxing QR сканер (Jetpack compose) | Android Studio & Kotlin
Годный контент!
В этом видео описывается создание простого приложения — сканера QR-кодов на Jetpack Compose и Android Studio при помощи библиотеки ZXing.
Параллельно добавляется Room + Hilt для записи отсканированных кодов в БД.
📎 Кликабельный план видео
📎 YouTube
@android_its
💻 Отличная шпаргалка по функциям в Kotlin
⏩Держите отличную презентацию по функциям в Kotlin, которая поможет повторить самое важное
Затрагиваются такие темы:
— функция main, точка входа
— компактные функции
— лямбды и функции высшего порядка
— список фильтров
— нетерпеливые и ленивые фильтры
Описано подробно и понятно, рекомендую
📎 Сайт со слайдами
@android_its
💻 Отличная статья-презентация о работе с шаблонизаторами Kotlin
⏩В статье рассматривается использование шаблонизатора Pebble для формирования HTML-документов и его особенности, включая поддержку фильтров, тегов и наследования шаблонов.
⏩Описаны условные конструкции, проверки и наследование шаблонов в рамках использования шаблонизатора Pebble.
⏩Обсуждаются принципы работы с шаблонами и передача списков данных в шаблоны.
⏩Параллельно рассматриваются различные аспекты разработки приложений на Kotlin, включая императивный, объектно-ориентированный и функциональный синтаксис; рассматривается работа с функциями в Kotlin и их объектная природа.
⏩Кроме этого обсуждается вопрос null-безопасности в Kotlin и удобные средства для обработки этой ситуации.
📎 Онлайн-презентация
@android_its
💻 Золотой век Kotlin, и какое будущее его ждёт
— «В компании Infobip с 2017 года и до сегодняшнего дня идет золотой век Kotlin. Будет ли он продолжаться, зависит исключительно от JetBrains и их способности внедрять инновации в Kotlin»
Полезная статья, в которой затрагиваются важные вещи, автор рассуждает о том, почему одни технологии сменяют другие, почему взлетевшие Scala и Groovy не так популярны сегодня и т.д.
Разбираются достоинства и недостатки Kotlin:
⏩Плюсы Kotlin
— Интероперабельность с Java
— Корутины
— Структура данных и сопоставление шаблонов
— Работа с Null
— Другие особенности
⏩Минусы Kotlin
— Интероперабельность с Java
— Экосистема Kotlin
— Рабочая сила
— Отсутствие прогресса
📎 Статья
@android_its
Android 15 Developer Preview 2!
Google выпустили предварительную сборку Android 15 Developer Preview 2.
🔸 Добавлен интерфейс для работы с спутниковой связью. Теперь Android 15 поддерживает обмен сообщениями SMS, MMS и RCS через спутник.
🔸 Новый раздел - "Передача аудио". Предполагается, что пользователь сможет передавать звук через Bluetooth одновременно на несколько наушников и динамиков с поддержкой Bluetooth. Однако на данный момент эта функция не работает.
🔸 "Режим веб-камеры" теперь поддерживает режим HQ-качества изображения.
🔸 Обнаружение записи экрана. Теперь, если приложение записывает ваш экран, вы получите уведомление об этом.
🔸 В разделе "О приложении" появилась функция "Отправить в архив". Архивация позволяет освободить до 60% пространства, сохраняя личную информацию.
Более подробную информацию о других изменениях можно найти в блоге Google. Заводские образы доступны по ссылке (начиная с Pixel 6).
https://developer.android.com/about/versions/15/download
@android_its
💻 Работа с интерфейсами Kotlin: правильная инициализация
⏩В Kotlin интерфейсы не имеют конструкторов и не способны создавать экземпляры сами по себе. Они выступают в качестве шаблонов для классов, которые обязаны их реализовывать, предлагая конкретные реализации абстрактных методов, предусмотренных интерфейсом. Вот наглядный пример:
interface MyInterface {
fun myFunction()
}
class MyClass : MyInterface {
override fun myFunction() {
println("Пришло время действовать!")
}
}
val myObject = MyClass()
myObject.myFunction()
Годная инфа для Android- и мобильных разрабов в целом
В этой таблице собраны особенности магазинов приложений, полезно учитывать при деплое
📎 А вот полезная статья в тему про деплой Flutter-приложений
@android_its
💻 Каррирование в Kotlin
⏩Kotlin поддерживает парадигму функционального программирования (ФП). Часто объектно ориентированный подход (ООП) ставят в противовес ФП, но они не соперники и могут дополнить друг друга. Одно из понятий ФП — каррирование функций.
⏩Например, преобразование функции в вид f(a)(b)
называется каррированием в честь Хаскелла Карри.
// Пример каррированной функции с применением fun
fun f(a: Int) = { b: Int -> a + b }
// Пример каррированной функции с применением переменной
val f2: (Int) -> (Int) -> Int = { b -> { a -> a + b } }
💻 Kotlin Coding Conventions
Соглашения в сфере разработки призваны помочь разработчикам писать понятный друг для друга код, в статье речь именно об этом.
Если вы только переходите от написания пет-проектов к работе над чем-то более серьёзным — загляните по ссылке в конце
Затрагиваются такие очевидные и не совсем вещи:
⏩Правила форматирования кода, отступы, фигурные скобки, использование замыкающих запятых
⏩Комментарии к документации, использование иммутабельных данных и значения параметров по умолчанию
⏩Особенности Kotlin, такие как использование именованных аргументов и условных операторов
⏩Рекомендации по использованию функций расширения, инфиксных функций и фабричных функций
Пишите код и помните: однажды работать с ним будет маньяк, который знает, где вы живёте)
📎 Читать
@android_its
💻 Из Figma в Composable: как работать с плагином Relay в Android Studio
⏩Одна из основных задач Android-разработчика — перенос компонентов пользовательского интерфейса из Figma в Composable-функции в Android Studio. Это можно делать вручную или использовать специальные плагины. Один из них — Relay для Android Studio. О Relay как раз и идёт речь в статье
Что внутри:
— Relay и для чего он нужен
— Как его установить
— Как настроить проект
— Как создать новостное приложение с помощью Relay
📎 Статья
@android_its
💻 KMP vs Flutter: 4 сценария, когда нужно сделать ставку на Kotlin Multiplatform, а не Flutter
Держите полезную статью
Кроссплатформенные инструменты помогают бизнесу не писать код два раза под iOS и Android, а переиспользовать его на обеих платформах. В статье — о том, чем Kotlin Multiplatform отличается от Flutter и в каких случаях он переигрывает и уничтожает Flutter.
▶️Некоторые выводы из статьи
Flutter — это решение для быстрого запуска небольшого продукта в том случае, если вы готовы мириться с ограничениями готовых компонентов.
Однако если у вас:
— премиальный продукт и вы хотите повысить комфорт пользователя
— есть планы нанять разработчиков в штат
— в команде есть готовые разработчики на Android и iOS
— уже есть нативное приложение
— вам нужно использование Bluetooth, приём звонков и другие нативные фичи
то лучше использовать KMP, позволяющий создать максимально привычный интерфейс
📎 Статья
@android_its
📱 Автоматизируем рутину в Android-разработке: плагин для создания шаблонного кода на примере создания -api -impl модулей
⏩Держите полезную статью о том, как можно автоматизировать повторяющуюся работу в андроид-разработке при помощи плагина для Android Studio.
Показывается, как можно создать свой шаблон модулей используя api wizard template, проблемы с которыми придётся столкнуться (в основном это ограниченный функционал api) и как можно их обойти.
📎 Статья
@android_its
💻 Конструкторы-самозванцы в Kotlin
Держите полезную статью о том, как можно нестандартно использовать функции верхнего уровня в Kotlin. О чём пойдёт речь в статье?
⏩В Kotlin возможны конструкции, которые могут выглядеть как вызовы конструкторов, но не являются таковыми
⏩Функции верхнего уровня в Kotlin разрешены и не ограничены регистром именования
⏩Использование оператора Companion.invoke()
может быть полезно для контроля создания объектов в статическом контексте
⏩Оператор receiver(Context) Companion.invoke()
позволяет делегировать создание объектов в локальном контексте
📎 Статья
@android_its
Mobox — полезная утилита для запуска windows x86 приложений на Android.
Проект работает через Termux, используя Box64 и Wine. Имеет простой и быстрый процесс установки.
@android_its
💻 Немного о конструкции when в Kotlin
⏩Конструкция when
проверяет значение некоторого объекта и в зависимости от его значения выполняет тот или иной код. Конструкция when
аналогична конструкции switch
в других языках. Формальное определение:
when(объект){
значение1 -> действия1
значение2 -> действия2
...
значениеN -> действияN
}
when
, то выполняются соответствующие действия, которые идут после оператора ->
после соответствующего значения:fun main() {
val isEnabled = true
when(isEnabled){
false -> println("isEnabled off")
true -> println("isEnabled on")
}
}
when
передается переменная isEnabled
. Далее ее значение по порядку сравнивается со значениями в false
и true
. В данном случае переменная isEnabled
равна true
, поэтому будет выполняться код:println("isEnabled on")
isEnabled
имела только 2 возможных варианта: true
и false
. Однако чаще бывают случаи, когда значения в блоке when
не покрывают все возможные значения объекта. Дополнительное выражение else
позволяет задать действия, которые выполняются, если объект не соответствует ни одному из значений:val a = 30
when(a){
10 -> println("a = 10")
20 -> println("a = 20")
else -> println("неопределенное значение")
}
a
равна 30, поэтому она не соответствует ни одному из значений в блоке when
. И соответственно будут выполняться инструкции из выражения else
.var a = 10
when(a){
10 -> {
println("a = 10")
a *= 2
}
20 -> {
println("a = 20")
a *= 5
}
else -> { println("неопределенное значение")}
}
println(a)
💻 Создаем первое приложение с Jetpack Compose на Kotlin
Держите годное видео о том, как с помощью фреймворка Jetpack Compose создать проект в Android Studio.
📎 Кликабельный план ролика
📎 Само видео
@android_its
💻 О .not()
и !
в Kotlin
Мы довольно часто используем оператор .not()
, поскольку это более читабельно, чем !
.
Но есть одна вещь, которую оператор .not()
не может сделать — поглядите:
myEvents?.forEach { myEvent ->
if (!myEvent.events.isNullOrEmpty()) {
myEvent.events.find { it.type == eventType }
}
if (myEvent.events.isNullOrEmpty().not()) {
myEvent.events.find { it.type == eventType }
}
}
💻 Библиотека Scout — быстрый и безопасный DI на Kotlin
Scout — это библиотека, появившаяся как результат большого количества проб и ошибок. Пет-проекты с кастомными DI-контейнерами. Изучение каждого нового DI-фреймворка, который появлялся в комьюнити.
Держите полезную статью о том, как Scout создавалась и какие проблемы может решать.
Вот ещё некоторые факты из статьи:
*️⃣Библиотека Scout использует рефлексию для доступа к содержимому графа и предоставляет защищенные методы для обращения к нему.
*️⃣Валидация графа становится сложной из-за отказа от аннотаций, но может быть проверена в unit-тестах.
*️⃣Библиотека предлагает удобный и настраиваемый валидатор графа зависимостей.
📎 Читать подробнее
@android_its
💻 Отличия Sequence API vs Collection в Kotlin
Держите хорошее объяснение отличий между 2 этими понятиями.
⏩В статье рассматриваются примеры, которые помогают визуализировать разницу между Sequence API и обычными коллекциями.
⏩Последовательность — это итерируемый тип, с которым можно работать, не создавая ненужных промежуточных коллекций.
⏩Sequence API в Kotlin могут обрабатывать данные более эффективно, чем обычные коллекции.
📎Читать подробнее: [ru], [en]
@android_its
💻 Создание анонимного экземпляра интерфейса в Kotlin
⏩Если сразу к сути, то для создания экземпляра анонимного интерфейса в Kotlin применяется объектное выражение. Определите интерфейс непосредственно при инициализации переменной следующим образом:
val myInterfaceInstance = object : MyInterface {
override fun myFunction() {
// Ваш код здесь
}
}
myInterfaceInstance.myFunction()
myInterfaceInstance
мы присваиваем объект, используя ключевое слово object :
fun interface MySAMInterface {
fun myAction()
}
val myInterfaceInstance = MySAMInterface {
println("Смотрите, мама, я пишу код без использования рук!")
}
myInterfaceInstance.myAction()
💻 Своё расширение в Kotlin
⏩Можно ли организовать свое собственное расширение в Kotlin? Да, это можно сделать через Delegate
:
class MyString {
fun myPrint(text: String) {
println(text)
}
}
MyString
с методом myPrint()
. Допустим нам надо сделать собственное расширение printRealExt()
без использование встроенных в Kotlin возможностей:fun MyString.printRealExt(text: String) {
println(text)
}
interface ExtensionPrint {
fun printExt(text: String)
}
class ExtensionPrintImpl : ExtensionPrint {
override fun printExt(text: String) {
println(text)
}
}
Delegation
делегируем этот метод:class MyString : ExtensionPrint by ExtensionPrintImpl() {
fun myPrint(text: String) {
println(text)
}
}
val myString = MyString()
myString.printRealExt("Real ext")
myString.printExt("Text from ext")
interface OneClassInterface {
fun someOne()
}
class OneClassImpl : OneClassInterface {
override fun someOne() {
println("some One")
}
}
interface TwoClassInterface {
fun someTwo()
}
class TwoClassImpl : TwoClassInterface {
override fun someTwo() {
println("someTwo")
}
}
class DerivedClass : OneClassInterface by OneClassImpl(), TwoClassInterface by TwoClassImpl()
Вариант для тех, кто ищет виртуальный сервер с хорошей веб-защитой — Aéza:
– Виртуальные сервера до 6.0 ГГц на лучших процессорах;
– Профессиональная фильтрация атак StormWall;
– Круглосуточная поддержка;
– Anycast фильтрация;
– Низкие цены;
– 15% кешбэка по ссылке.
Бесконечно можно смотреть на три вещи: на огонь, воду и скидку от Aeza!
Говорят: твоё от тебя не уйдет. А зачем ждать? Динозавры тоже ждали и остались в прошлом
Используй 50% скидку и погнали в будущее!
Кроме того, сейчас Aéza раздает личные бесплатные сервера, забираем тут. Регистрация, подписка, платежи не потребуются.
Реклама. Индивидуальный предприниматель Лобанов Леонид Константинович. ИНН 781625705648 erid: LjN8KEr3S