Android Live 🤖
Відкрити в Telegram
Самые свежие новости, новинки и тренды Android от практикующего разработчика. Автор: @al_gorshkov, Чат: @android_live_chat Личный блог: @al_gorshkov_blog Рекламу не размещаю
Показати більше5 158
Підписники
Немає даних24 години
+17 днів
-930 день
Архів дописів
5 158
Кроссплатформенные приложения на Kotlin
#kotlin #crossplatform #compose
Одним из главных преимуществ Flutter перед Kotlin Multiplatform на сегодня является возможность создавать общий UI. К счастью, JetBrains работает над этой проблемой, и не так давно был анонс Jetpack Compose, который работает на Windows.
Нашёл статью, где описан пример приложения, работающего как под Windows, так и под Android. Автор использует библиотеку Decompose, созданную для улучшения работы с бизнес логикой, навигацией и UI.
Уже нет сомнений, что Jetpack Compose будущее UI для Android. Интересно, насколько Jetpack Compose приживётся в создании приложений под Windows? 🤔
5 158
Вместе с тем как растет количество владельцев смартфонов, увеличивается спрос на специалистов, умеющих ими управлять и программировать. Android-разработчик — профессия будущего.
Если вы хотите ворваться в перспективную IT-сферу — приходите на Факультет Android-разработки образовательной экосистемы GeekBrains.
Вместе с опытными учителями-практиками освоите современные технологии Android-разработки и научитесь делать свои приложения. Получите все нужные навыки, диплом, сертификат и поддержку при трудоустройстве. Кстати, год учебной практики в GeekBrains — это год реального рабочего опыта. Сможете претендовать на позиции не только junior, но и middle.
После успешного окончания обучения на факультете GeekBrains гарантирует трудоустройство в Mail.ru Group или в одну из компаний-партнеров.
Записывайтесь прямо сейчас — и получите скидку 45% → https://geekbrains.ru/link/Xv8Br6
5 158
Ещё про MotionLayout
#motionlayout #subscribers
Новая рубрика, где каждый из вас может поделиться интересными статьями начинается!
Вдогонку ко вчерашнему посту, рассказывающем о знакомстве с MotionLayout, @Vel_daN делится циклом своих статей, где рассказывает о более глубоком использовании этого компонента.
Главным недостатком MotionLayout является то, что если мы хотим создать анимацию с его использованием, то необходимо зарегистрировать все состояния в MotionScene при помощи ConstraintSet. Если наша анимация объёмная, то это сбивает с толку, становится нечитаемым, ну и всё ещё не отображается в runtime.
Решение — это использовать xml-файлы, что заметно сокращает код и делает его более читаемым. Пока есть три статьи, вот первая, вторая и третья.
@Vel_daN также согласился ответить на ваши вопросы, связанные с MotionLayout и поделиться своим опытом, поэтому если у вас есть вопросы — можете задавать их в нашем чате.
5 158
Знакомство с MotionLayout
#intro #motionlayout
Думаю, что многие из вас уже знакомы с MotionLayout и теми фичами, которые он предоставляет. Если нет или вы недавно в Android-разработке, то пара статей поможет вам быстро разобраться с базовыми вещами, которые в нём есть.
Для начала есть статья, которая описывает функции Motion Editor — базового инструмента для предварительного просмотра созданных при помощи MotionLayout анимаций. В ней можно почитать про основные панели — Overview, Selection, Attribute, Preview и на примере посмотреть, как их использовать в проекте.
А если вы уже изучили теорию или она кажется вам слишком скучной, то есть CodeLab, где можно на практике закодидить анимацию и посмотреть, как она будет работать в реальном проекте. Тут можно изучить:
• ConstraintSets;
• анимации, которые работают на drag events;
• изменение анимации при помощи KeyPosition;
• изменение атрибутов при помощи KeyAttribute.
• анимацию шапки при помощи MotionLayout.
5 158
Firebase Android BoM
#firebase
Недавно настраивал пуш-уведомления для проекта и, как обычно, полез в документацию Firebase, чтобы посмотреть необходимые зависимости.
К моему удивлению, появился механизм, который называется Firebase Android BoM.
Суть в том, что теперь не нужно обновлять все версии Firebase библиотек по отдельности, а достаточно обновить только одну версию — версию BoM. Главной фишкой является то, что обновлённые библиотеки будут совместимы между собой.
Выглядит это так:
dependencies {
// Import the BoM for the Firebase platform
implementation platform('com.google.firebase:firebase-bom:26.1.0')
// Declare the dependencies for the desired Firebase products without specifying versions
// For example, declare the dependencies for Firebase Authentication and Cloud Firestore
implementation 'com.google.firebase:firebase-auth'
implementation 'com.google.firebase:firebase-firestore'
}
Посмотреть, какие конкретно версии библиотек включены в конкретный BoM можно тут, а почитать детальнее можно в документации.5 158
Пост для Android-разработчиков, которые следят за безопасностью своих приложений 🔥🔥🔥
Авторский канал «paradiSEcurity» расскажет про информационную безопасносность мобильных приложений.
В кратких, но емких постах раскрываются важные темы:
🌶 как создавать безопасные приложения
🌶 как сделать реверс приложения
🌶 почему сложно организовать голосование на выборах через приложение
Если интересуешься лучшими практиками защиты приложений и хочешь понимать, почему даже они не всегда выдерживают хакерские атаки, то 👉 @paradisecurity
5 158
Новый рубрики
#android_live
Хочется добавить на канал больше социальной активности и пользы для вас, мои подписчики ✌️. Поэтому, хочу анонсировать две новые рубрики на канале:
1) От подписчика. Теперь у каждого из вас есть возможность поделиться чем-то с другими. Это может быть что угодно: начиная от статьи, которая вам понравилась и может понравиться другим и заканчивая уникальным опытом работы в компании, открытия своего стартапа или проекта. А вдруг среди нас есть авторы известных библиотек, и вы хотите ответить на вопросы разработчиков, чтобы сделать своё творение ещё лучше. Всем этим можно поделиться на канале в виде простого поста или целого треда с обсуждениями.
2) Вопрос к эксперту. Также у вас есть возможность узнать ответ на наболевший вопрос у экспертов. Возможно, вы не знаете как правильно решить конфликт у себя в команде, а может у вас нет представления, куда двигаться в карьерном плане. Теперь можно получить ответы на эти и многие другие вопросы здесь – на канале. Эксперты будут подбираться мной в зависимости от специфики вопроса.
Важно, чтобы этот вопрос был интересен не только вам, а также не был таким, ответ на который легко загуглить.
Не стесняйтесь участвовать в этих активностях и пишите мне. А также напоминаю, что обсудить всё, что происходит на канале можно у нас в чате.
5 158
Как сделать компилятор Kotlin умнее
#article #kotlin
Компилятор Kotlin довольно умный и даёт нам подсказки о наших же ошибках.
Одной из самых заметных фич в компиляторе Kotlin является smart casting. Это значит, что компилятор может выполнять приведение типов на основе проверок, выполненных разработчиком.
Однако механизм smart casting не безграничен. Например, компилятор может проверить переменные только в том блоке, где эти проверки были непосредственно выполнены.
Немногие разработчики знают, что можно написать контракты, которые помогут компилятору в его работе. Например, если вы создадите контракт, функция которого возвращает true, в случае если переменная не равна null, компилятор выполнит приведение типа и сделает нашу переменную non-nullable.
Contract DSL выглядит так:
fun foo(): Boolean {
contract {
// Effect
}
// Function body
}
Можно использовать следующие функции для того, чтобы описать контракт:
🔸returns(value) — описывает ситуацию, когда функция нормально возвращается с указанным значением.
🔸returnsNotNull() — описывает ситуацию, когда функция возвращает non-nullable значение.
🔸implies(booleanExpression) — указывает, что данный наблюдаемый эффект будет истинным при заданном booleanExpression
🔸callsInPlace(lambda, kind) — позволяет указать, как часто будет выполняться данная лямбда.
Краткое описание параметров способно запутать, но можно обратиться к статье, чтобы получить больше информации с примерами. Надеюсь, что в будущем появится ещё больше функций для описания контрактов 🤟.5 158
Немного про let
#kotlin #article
Во вчерашнем посте был первый совет с использованием let для проверки переменной на null. @atlantik_hak подкинул годную статью, где описываются примеры, когда не стоит использовать let для этих целей, а когда let — самое лучшее решение для проверки.
Итак, когда лучше не использовать let:
⭕ для проверки на null immutable переменной. Хотя и запись
a?.let { foo(a) } получается довольно изящной, она генерирует лишнюю переменную в байткоде, в отличии от аналога if not null. Врядли вы заметите огромную разницу, но если можно избежать создания лишней переменной, то почему бы этого не сделать.
⭕ если вы хотите использовать переменную только внутри let. Чаще всего мы делаем проверку именно для того, чтобы использовать её внутри блока. Например, мы хотим что-то сделать с webView:
webviewSetting?.let {
it.javaScriptEnabled = true
it.databaseEnabled = true
}
вместо этого можно использовать функцию run
webviewSetting?.run {
javaScriptEnabled = true
databaseEnabled = true
}
который уберёт лишние it.
⭕ если хотите передать переменную дальше по цепочке. Например, если вы хотите указать размер списка, если он не null, а дальше что-то продолжить делать с ним. Альтернативным решением будет использование also, хотя это тоже не идеальное решение.
Когда же тогда использовать let?
🟢 для проверки на null mutable переменной. Тут хорошо подходит let, так как он избавляет нас от дополнительного ? при взаимодействии с переменной.
private var str: String? = null
fun process() {
str?.let { /*Do something*/ }
}
🟢 если хотите использовать переменную снаружи от let. Например, если вы хотите проициализировать другие переменные тем классом, что был у вас:
var javaScriptEnabled = false
var databaseEnabled = false
webviewSetting?.let {
javaScriptEnabled = it.javaScriptEnabled
databaseEnabled = it.databaseEnabled
}
Это удобнее для review кода, чем функция run.
🟢 когда у вас есть проверка из цепочки `?`. Например:
return string?.asIterable()?.distinct()?.sorted()
генерирует больше байткода, чем:
return string?.let {
it.asIterable().distinct().sorted()
}
Спасибо подписчикам, которые дают обратную связь по постам ✌️.
И уверен, что теперь вы будете использовать let аккуратнее.5 158
Несколько советов по Kotlin для Android разработчиков
#article #kotlin
Ни для кого не секрет, что сегодня Kotlin — это официальный язык для нативной разработки под Android. Он призван уменьшить количество написанного кода и улучшить его качество.
В целом, со своей задачей он справляется, однако не все разработчики используют все фичи этого языка при написании кода, делая всё «по старинке».
Попалась статья, которая даёт 7 советов написания кода «Kotlinic» способом. Вот несколько из них:
🔸используйте функцию `let`, чтобы проверить поле на null. Проверка на null — это очень распространённое действие, несмотря на то, что в Kotlin есть nullable-переменные. Многие забывают, что существует хорошая альтернатива
if not null выражению — функция let, в которой код превращается в a?.let { foo(a) }.
🔸используйте функции для создания списков. Очень часто мы для заполнения списков используем цикл for и забываем про средста Kotlin.
Например, заполнить список значениями по умолчанию можно в одну строку:
val list = IntArray(10) { 1 }.asList().
Но подобным образом можно заполнить список разными значениями:
val list = List(5, {it*2}), что даст нам список от 0 до 8 с шагом 2.
🔸используйте `require` и `check` для работы с исключениями. Например, если мы хотим, чтобы наша переменная была больше нуля, то можно вызвать функцию:
require(n >0) { Should be more than zero }.
🔸используйте `apply` и `with`, чтобы уменьшить повторы кода. Эти две функции полезны, если мы хотим сделать несколько действий с нашей переменной. Такое часто бывает при работе сo RecyclerView, которому нужно задать layout manager и несколько других свойств.
🔸используйте методы `partition` и `groupBy` для списков. Эти функции помогают нам сделать несколько списков из одного по заданному условию.
Добавлю сюда ещё функцию groupByTo, в которой мы можем указать то, в какую структуру превратить наш список.
🔸используйте method references вместо lambda expressions для простых действий. Довольно интересный совет, который не так часто видишь в коде.
Например, у нас есть список объектов Person, который мы хотим преобразовать в список имён. Мы можем использовать method references в map, чтобы сделать это более красивым способом:
val names = persons.map(Person::name).
Надеюсь, что вы нашли для себя полезный совет, который будете применять на практике. 🤓5 158
🔥Узнайте больше про Android-разработку на Kotlin на бесплатных демо-уроках онлайн-курсов «Android Developer. Professional» и «Android Developer. Basic» от OTUS и Альфа-Банка:
📌«Kotlin codegeneration» (продвинутый курс): https://otus.pw/od80/
— Рассмотрим, зачем может понадобиться кодогенерация. Узнаем, что такое Annotation Processing. Изучим фреймворк для генерации кода. Погенерируем свой код и уберем бойлерплейт из нашего приложения.
📌«Unit-тестирование в Android» (базовый курс): https://otus.pw/CnMm/
— Изучим Unit-тесты. Научимся тестировать компоненты, классы и методы в Java. Рассмотрим технологию TDD.
👉🏻Регистрируйтесь сейчас — напомним в день вебинара!
5 158
История про memory leaks, WeakReferences и ошибки при исправлении
#article
Попалась любопытная статья, где рассказывается о неверном использовании механизма ссылок
WeakReference.
В ней описывается пример использования WeakReference как костыля для работы с утечками памяти. Автор решил изучить вопрос, и рассмотрел несколько вариантов борьбы с этой проблемой.
Описываются все плюсы и минусы решений. Тут и EventBus, и LiveData, и RxJava с BehaviorRelay, да и многие другие, менее очевидные решения.
Множество информации можно почерпнуть тут.5 158
Результаты розыгрыша билета на Mobius 2020
#конкурс #conference
Итак, самое время опубликовать результаты конкурса, который был объявлен в предыдущем посте.
В конкурсе принял участие 41 человек. При помощи генератора случайных чисел был выбран победитель — @ddgradd, с чем я его поздравляю! 🎊
Видео с выбором победителя тут. Обязательно участвуйте в новых конкурсах и конечно же выигрывайте!
5 158
Mobius 2020
#conference
Уже на следующей неделе, с 11 по 14 ноября, нас ожидает конференция для мобильных разработчиков — Mobius 2020.
Расписание полностью сформировано, и для нашего удобства доклады разделены на 4 дня.
Поделюсь парочкой интересны для меня докладов:
В докладе Увлекательная жизнь в панели уведомлений, Кирилл Розов расскажет про работу с уведомлениями, их настройкой в разных версиях Android. Выглядит интересно, и мне кажется, что notification часто недооценивают разработчики и не используют их на 100%.
Есть сразу несколько докладов, связанных с декларативными фреимворками, вот один их них: Декларативный UI сегодня — Петр Козлов и другие спикеры сравнят существующие решения для декларативного UI, в каком статусе они находятся сегодня и стоит ли использовать их в production.
В докладе Offline-mode в несколько строк кода Алексей Быков поделится тем, как правильно создавать абстракцию для работы с данными и реализовать кэширование в несколько строк кода. Посмотрим, насколько подобный подход универсален для всех приложений.
Есть несколько воркшопов, и вот один из них: Flutter Zero LiveShow от Александра Денисова, где в прямом эфире будет написано приложение с нуля на Flutter. Лично мне интересно посмотреть итоговый результат. 🤓
Всё расписание можно почитать тут, а купить билеты со скидкой по промокоду AndroidLive2020aupc на конференцию можно тут.
Но это ещё не всё. Не могу оставить вас без шанса выиграть один билет на конференцию бесплатно. 🤗
Всё что нужно сделать — это оставить свой никнейм в Telegram в этой форме, результаты розыгрыша будут объявлены 9 ноября в 18:00.
5 158
Jetpack Compose for Desktop
#jetpack #compose
Сегодня появилась хорошая новость: команда JetBrains анонсировала выход первого релиза Jetpack Compose for Desktop — фреимворк для UI, который теперь позволяет делать UI для компьютеров!
Он базируется на известном нам Jetpack Compose, который уже в более поздней стадии разработки под Android. И самое главное то, что есть возможность переиспользования этих компонентов между собой.
Уже есть несколько примеров приложений, а чуть больше деталей об инструменте можно почитать тут.
5 158
⚡ Какие навыки нужны начинающему iOS-разработчику, чтобы занять уверенные позиции в профессии?
6 ноября в 20:00 Константин Савялов поделится карьерными инсайтами и представит программу онлайн-курса «iOS Developer. Basic».
Регистрация на вебинар: https://otus.pw/hcuu/
5 158
Автоматическое обновление зависимостей gradle
#gradle #library
Обновление зависимостей gradle, особенно в большом проекте, может стать отдельной задачей. 🤦♂️
Разработчикам чаще всего приходится вручную проверять новые версии, что приводит к потере времени. Нет смысла не делать обновления: разработчики делают правки в библиотеках, улучшают их производительность и качество.
Есть любопытное решение, которое я не встречал раньше — Releases Hub Gradle Plugin. Плагин проверяет текущие версии библиотек (например во время сборки билда на CI) и делает PR с обновлениями. Каждый PR содержит информацию об новых фичах, добавленных в обновлении, ссылки на документацию, настройки веток и т.д.
Выглядит довольно интересно, но всё равно на разработчике и QA лежит задача проверки работоспособности приложения после каждого обновления, особенно когда дело касается важных библиотек.
Больше почитать о плагине можно тут.
5 158
Уроки по Navigation Component
#navigation #jetpack #poll
Разработчики от Google начали делать раздел, посвящённый современным паттернам Android-разработки, где детально описывают, как применять современные подходы разработки для приложений.
Недавно у них завершилась неделя по Navigation Architecture Component, где нам дали краткое, но ёмкое overview по этому компоненту.
🔸в первом эпизоде описываются базовые принципы работы navigation: как добавить её в приложение, из каких частей она состоит, как работают некоторые части API, чтобы заставить навигацию работать. В текстовом виде можно почитать тут.
🔸во втором видео говорится об использовании navgiation для показа диалогов. Это пример того, как использовать navigation вне
NavHostFragment. В текстовом виде тут.
🔸в третьем эпизоде говорится о SafeArgs: это способ безопасной передачи данных между компонентами в navgiaton. В тексте тут.
🔸в четвёртом эпизоде информация о механизме Deep Links, и о том как реализовать их при помощи navigation. В тексте тут.
🔸последний эпизод — это Q&A сессия со спикерами, где они отвечают на популярные вопросы: multiple backstacks, поддержка Jetpack Compose, Up-vs-Back, saving state и другое. Текста, к сожалению, нет, но и сделать его из такого большого видео было бы проблематично.
Также приложение, которое использовалось в качестве примера на протяжении всей серии.
А вы используете, Navigation Component в своих проектах?5 158
Жизнь в Германии
#интервью #экспаты
Итак, второе интервью на канале про жизнь в разных странах!
Наш гость — Василий Лютиков. Он проживает в городе Остфильдерн, недалеко от Штутгарта в Германии. Он работает iOS-разработчиком в компании Mädchenflohmarkt GmbH, компания, которая позволяет избавится от лишних вещей в женском гардеробе и название которой довольно сложно произнести русскоговорящему человеку.
Хотя Василий и не Android-разработчик, уверен, что сможет дать кучу информации про Германию всем нам.
У каждого, как всегда, есть возможность задать свои вопросы в форме тут.
5 158
Бесконечный список с Paging Library и Flow
#flow #jetpack
Сегодня вышел релиз coroutines 1.4.0, где было много классных изменений, связанных с Flow.
Мне кажется, что сегодня Flow довольно стабилен, и нет смысла не использовать его в production-проектах, тем более, когда стабильными стали
StateFlow и SharedFlow.
Хочу поделиться статьёй, где автор рассказывает о создании бесконечного списка с помощью объединения Flow и Paging Library.
В итоге получился довольно лаконичный код, где разработчику нужно по минимуму заморачиваться с логикой получения списка.
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
