Android Live 🤖
رفتن به کانال در Telegram
Самые свежие новости, новинки и тренды Android от практикующего разработчика. Автор: @al_gorshkov, Чат: @android_live_chat Личный блог: @al_gorshkov_blog Рекламу не размещаю
نمایش بیشتر5 158
مشترکین
-224 ساعت
+17 روز
-1030 روز
آرشیو پست ها
5 158
Хотите научиться программировать на Android?
Тогда поступайте на факультет Android-разработки с гарантированным трудоустройством. А еще вас ждет скидка 30% на курс!
Стать Android-разработчиком: https://tprg.ru/SN8v
5 158
Новое API для Flow и UI-слоя
#flow #jetpack
Пару дней назад Google выпустили обновление для API
Flow, где заметно улучшили его взаимодействие с UI-слоем.
Если говорить о текущем состоянии, то, в целом, мы уже можем использовать Flow и отказаться от LiveData. Правда, есть одно замечание: может быть не безопасно подписываться в UI-слое на холодный Flow, если мы вручную не можем отменить задачу, которая им выполняется. В качестве примера в статье приводится обновление локации пользователя и возможное текущее решение.
Теперь у нас есть три новых метода:
🔸 LifecycleOwner.addRepeatingJob — принимает Lifecycle.State в качестве параметра и используется для автоматического создания и старта новой корутины и отменяет её, когда состояние достигнет противоположного значения.
🔸Lifecycle.repeatOnLifecycle — аналогичная функция, но только для Lifecycle.
🔸Flow.flowWithLifecycle — этот API использует предыдущую функцию под капотом и также закрывает «продьюсера» в момент противоположного состояния жизненного цикла. Кроме этого, данную фукнцию можно встроить напрямую в целочку вызова Flow, что делает вызов более лаконичным. Важно помнить, что эта функция работает по аналогии с Flow.flowOn, которая затрагивает только цепочку, которая выше неё и добавляет буфер для предотвращения backpressure.
В целом, в статье упоминается то, что теперь можно полностью эмитировать поведение LiveData и использовать Flow в приложениях, где вы хотите использовать только Kotlin API. Это здорово, но пока API находится в alpha-версии и стоит тащить его к себе аккуратно.
Кроме этого, если вам это нужно, добавили поддержку data binding для Flow. Детали тут.5 158
🔥 Бесплатные практические демо-занятия продвинутого и базового курсов по Android-разработке на Kotlin от OTUS и Альфа-Банка!
📌 24.03 (Сегодня) - «Рисуем свой график котировок в Android» с Вадимом Гальцевым: https://otus.pw/bEfa/
Что будем делать:
Рассмотрим основные инструменты для рисования, изучим возможности классов Canvas, Path, Paint, нарисуем кастомизируемый график котировок и добавим в него анимаций
📌25.03 - «Крестики-нолики на минималках» с Антоном Мачихиным, старшим разработчиком в ООО "Миркод": https://otus.pw/L8hU/
Чему научимся:
Пользоваться средой разработки Android Studio, верстать экран, создавать собственную View
📌 Регистрируйся, а мы напомним в дату проведения вебинара!
5 158
Flutter vs Kotlin Multiplatform Mobile
#youtube
Напоминаю всем про сегодняшний стрим, где будем обсуждать плюсы и минусы каждого из фреймворков. Больше деталей тут.
Трансляция пройдёт онлайн, 24 марта в 18:00 по МСК, как всегда на Youtube-канале AndroidLive. Ссылка на трансляцию тут, задавайте свои вопросы и темы для сравнения тут.
До встречи!🤟
5 158
Дополнительная настройка Timber
#library
Timber довольная популярная библиотека для логирования. Она включает в себя не очень много дополнительных методов, однако значительно облегчает ввод логов, по сравнению со стандартными средствами.
Есть вариант использовать официальную библиотеку от JakeWharton, но мне больше по душе fork, где добавили чуть больше возможностей для работы с Kotlin.
Пара полезных настроек, которые улучшат взаимодействие с библиотекой и качеством логов:
1️⃣ Добавьте глобальный тег в настройках, чтобы было проще увидеть логи из вашего приложения. Сделать это можно при помощи переопределения метода
log в DebugTree, вызвав super.log(priority, "global_tag_$tag", message, t).
2️⃣ Добавьте название метода, из которого было показано данное сообщение. Для этого нужно переопределить метод createStackElementTag в том же DebugTree, отформатировав показ сообщения.
Кроме этого, можно добавить сюда же и номер линии из которой было вызвано сообщение.
Больше кода об этих настройках можно найти тут.5 158
🔥 Бесплатное практическое демо-занятие продвинутого курса по Android-разработке на Kotlin от OTUS и Альфа-Банка!
📌 24.03 - «Рисуем свой график котировок в Android» с Вадимом Гальцевым: https://otus.pw/PTt3/
Чему научимся:
— Рассмотрим основные инструменты для рисования
— Изучим возможности классов Canvas, Path, Paint
— Нарисуем кастомизируемый график котировок и добавим в него анимаций
📌 Регистрируйся, а мы напомним в дату проведения вебинара!
Уже все умеешь? Проверь свои знания в, казалось бы, сложном тесте по ссылке https://otus.pw/1yso/
5 158
onActivityCreated() во Fragment — deprecated
#fragment
Наверное, это уже не новость, но кто знает, может вы, как и я, пропустили её.
Стоило мне обновить версии библиотек в основном проекте, как я увидел, что метод
onActivityCreated() стал deprecated.
Что это вообще за метод, и почему он стал теперь deprecated?
Этот метод существует по той причине, что фрагменты не могут существовать как независимый компонент. Для их работы и отображения необходим или контейнер в Activity, или родительский Fragment. Для того, чтобы сообщить, что Activity был создан и был создан этот метод.
Но технологии развиваются и приходит переосмысление некоторым вещам. Не кажется ли вам странным, что один класс имеет метод в своём жизненнном цикле о том, что был создан его родительский класс? Вот и разработчики Google посчитали это странным и решили сделать Fragment менее зависимым от родительского компонента и убрать этот метод.
Сейчас есть две рекомендации:
1️⃣ Все операции, связанные со View во Fragment нужно делать в onViewCreated().
2️⃣ Если вам нужно получить информацию о том, что Activity была создана, то можно зарегистрировать LifeCycleObserver в методе onAttach() и удалён после вызова метода onCreate(). Как по мне, звучит как костыль.
В целом, интересно, как будет вести себя Fragment дальше, если его делают менее зависимым от других частей приложения. 🤔5 158
🔥 Бесплатные практические демо-занятия по Android-разработке на Kotlin от OTUS и Альфа-Банка!
📌 22.03 - «Рисуем свой график котировок в Android» с Вадимом Гальцевым: https://otus.pw/FLHe/
Что будем делать:
Рассмотрим основные инструменты для рисования, изучим возможности классов Canvas, Path, Paint, нарисуем кастомизируемый график котировок и добавим в него анимаций
📌25.03 - «Крестики-нолики на минималках» с Антоном Мачихиным, старшим разработчиком в ООО "Миркод": https://otus.pw/G4xa/
Чему научимся:
Пользоваться средой разработки Android Studio, верстать экран, создавать собственную View
📌 Регистрируйся, а мы напомним в дату проведения вебинара!
Уже все умеешь? Проверь свои знания в, казалось бы, сложном тесте по ссылке https://otus.pw/xHYl/
5 158
Как измерить и оптимизировать размера Bitmap
#view #library
Если мы видим падение с
OutOfMemory, то чаще всего думаем про утечки, которые есть в приложении. Однако, подобная ошибка не всегда вызвана утечками памяти. Одной из причин может быть чрезмерное использование памяти нашим приложением, из-за неправильной загрузки изображений.
Есть хорошая статья о том, как понять, что что-то не так с изображениями.
1️⃣ Первым шагом должно быть определение размера bitmap. Сделать это можно при помощи profiler. Автор также советует использовать устройства с Android 7.1 и ниже, так как там можно увидеть preview изображения.
2️⃣ Далее стоит посмотреть на качество вашего изображения и на размер ImageView, в который вы его загружаете. Если оно меньше, то полезно будет использовать методы fit() и centerInside() для Glide и Picasso.
3️⃣ Ну и напоследок стоит обратить внимание на профиль для загрузки изображений. По умолчанию может быть AGRB_8888, который использует 4 байта для каждого из пикселей. Но для большинства задач достаточно RGB_565, который использует в 2 раза меньше байтов. Да, качество изображений получается хуже, и нет поддержки прозрачности. Но для многих задач достаточно и такого качества.5 158
Ежегодный опрос команд российской разработки
В этом году начался ежегодный, пятый опрос про отечественные мобильные команды разработки. Из него можно узнать:
📖 откуда мобильщики получают новые знания;
💪 какие команды мобильной разработки самые сильные;
🌟 в каких компаниях мобильные разработчики хотят работать больше всего.
Вот результаты прошлого года, а поучаствовать в опросе этого года можно тут. Опрос займёт не больше минуты.
Не забудьте выбрать на одном из шагов также канал Android Live, для меня это очень важно 🤝.
5 158
Устанавливаем одновременно несколько версий приложения
#beginners
Многие разработчики используют свои телефоны в качестве устройств для тестирования и разработки. В целом, в этом нет ничего плохого, однако есть одна проблема: по умолчанию вы можете иметь только одну версию приложения на устройстве.
Ситуация усугубляется, если вы хотите держать одновременно debug, test и release версии.
К счастью, есть достаточно простое решение, которое позволит иметь сколько угодно версий одного и того же приложения на одном устройстве. Вот вам инструкция, как это сделать:
🔸настройте отдельные
buildTypes. Сделаем test и release;
🔸добавьте applicationIdSuffix для test-версии. Например, _test;
🔸добавьте новое название test-сборки. В Android Studio добавьте новый xml-файл для строк, который поместите в папку test/res/values. Там уже сделайте нужное вам название, а название релизного билда переместите в release/res/values.
🔸добавьте новую иконку по такому же алгоритму. Вам нужно добавить её в test/res, Android Studio может всё переместить за вас.
🔸зарегистрируйте новое приложение в проекте для Firebase и поправьте файл google-services.json, который вам обновит сам Firebase.
На этом всё, проблема нескольких сборок решена. Детальнее можно почитать тут.5 158
Создание простого плагина в Android Studio
#theory
Попалась любопытная статья, которая повзоляет показывать границы макета при помощи плагина в Android Studio. Правда, это ещё только первая часть статьи, поэтому основная функциональность будет чуть позже.
Но главное то, что автор предлагает сделать этот плагин самостоятельно, написав при этом десяток строк кода.
По сути, вся работа заключается в следующем:
1) Создаём новый проект, выбирая «IntelliJ platform plugin» из списка.
2) Далее создаём новое действие, наследуясь от класса
AnAction.
В целом, это всё🤟. Осталось только подключить итоговый плагин к студии и выполнять нужные вам действия. Статья будет полезной, если вы планируете писать собственные плагины и автоматизировать рутинные действия.5 158
Как адаптировать приложение под Huawei Mobile Services в 6 простых шагов
В 2020 на долю Huawei в России пришлось почти 18% мобильного рынка. Фанбаза гиганта продолжает расти даже несмотря на отдельно стоящую от Google экосистему сервисов. Пока власти США и Китая решают разногласия, разработчикам приходится выкручиваться
Георгий Гигаури, который разрабатывает Android-приложение Delivery Club, поделился своим опытом по оперативной реализации поддержки Huawei-устройств. Поэтапный гайд можно прочитать на Хабре, а для любителей видео в конце статьи есть приятный бонус с конференции Mobius 2020
5 158
Как data-классы влияют на размер приложения
#kotlin
В Kotlin используется огромное количество разнообразных фич: null safety, smart casts, inline-функции, sealed-классы. Одной из самых часто используемых фич является data-классы.
Мы уже обсуждали на канале то, что разработчики используют их там, где вся функциональность этих классов не нужна. Хотелось бы ещё раз посмотреть на реальную цену использования data-классов с точки зрения размерности приложения.
При помощи R8 из релизного приложения удаляются
componentN()-функции и метод copy(). Но имплементация toString(), equals() и hashCode() остаётся в проекте.
Автор статьи при помощи gradle-плагина удалил эти методы и получил уменьшение размера приложения на 500KiB (или 4% от всего размера приложения), а также уменьшение числа методов почти на 15000.
Можно попробовать применить этот плагин к своим приложениям, а также помнить о разумном применении data-классов.5 158
В канале Мобильная разработка рассказываем о тонкостях разработки приложений под Android, iOS и кроссплатформу.
Подключайтесь, если ещё не: @mobi_dev
5 158
Flutter vs Kotlin Multiplatform Mobile
#youtube
Кроссплатформенные фреимворки всегда вызывали жаркие споры у разработчиков. Некоторые считают, что это полезный инструмент, который может уменьшить количество дублированного кода и позволяет писать качественные приложения. Другие — что кроссплатформа никогда не сможет сравниться с нативными решениями и не стоит тратить на неё время.
Если вы сторонник первого мнения, то может возникнуть вопрос, какой инструмент выбрать. В современном мире мобильной разработки есть два основных кроссплатформенных фреймворка: Flutter и Kotlin Multiplatform Mobile.
Давайте обсудим с экспертами в этих технологиях то, какие преимущества и недостатки имеет каждый фреймворк! Будем сравнивать и лёгкость в изучении, и размер приложений, и наличие библиотек, и коммьюнити… и многое другое. Свои идеи и вопросы можете накидать сюда.
Наши эксперты:
🔴 Александр Денисов, Lead Software Engineer, Co-Head of Flutter Competency в EPAM Systems, Flutter and Dart GDE. В разработке уже 15 лет, а с появлением Flutter активно увлекся разработкой на Dart.
🟢Артём Олков, разработчик в Яндекс.Диск, член ПК Podlodka iOS Crew. В программировании с 2011 года, с 2013 пишет на iOS. С 2019-го года разрабатывает Яндекс.Диск, где и внедрил KMM в прод.
Трансляция пройдёт онлайн, 24 марта в 18:00 по МСК, как всегда на Youtube-канале AndroidLive. Ссылка на трансляцию тут, задавайте свои вопросы и темы для сравнения тут.
До встречи!🤟
5 158
Будущее разработки: Kotlin Multiplatform и декларативный UI
#theory #crossplatform
Попалась любопытная статья, которая описывает «будущее разработки». Конечно же это только мнение, но от многих разработчиков я слышал подобное, описанное в этой статье мнение, а также по большей части я солидарен, что разработка движется именно в этом направлении.
Автор рассказывает о применении Kotlin Multiplatform на Android, iOS и Web. Основные тезисы:
🔹переиспользовать 85% кода;
🔹UI описывается при помощи декларативных фреимворков;
🔹MVI-архитектура с единым состоянием View;
🔹так как не нужно писать логику на 3 платформах, то клиентные приложения становятся дешевле в создании и поддержке.
Кроме того, автор описывает те решения, что существуют сейчас на каждой из платформ. Например, для декларативного UI на Android уже есть всем нам знакомый Jetpack Compose, для iOS — SwiftUI, а для Web — React.js.
Удивился тому, сколько уже написано решений для Multiplatform. Это и HTTP-клиент, и SQL-обёртка для базы данных, и аналог
SharedPreferences. В общем, обо всём этом можно узнать, прочитав статью.
Она состоит из 3 частей, ссылка на первую, вторую и третью части.
Близко ли вам мнение, описанное автором статьи? И куда по вашему мнению движется разработка будущего?5 158
Material Navigation Rail
#view #material
Возможно вы, как и я, пропустили выход свежей alpha-версии material-библиотеки. Туда включили фиксы, связанные с
ProgressIndicator, а что нас больше интересует — так это новый компонент NavigationRail.
По сути, он повторяет функциональность BottomNavigationView, но располагается сбоку, а не снизу. Количество элементов при этом может быть от 3 до 7, а каждый компонент может включать в себя иконку, заголовок и значок-индикатор. Этот значок можно просто показать в виде точки, а можно добавить счётчик. Кроме этого, можно добавить header.
Как по мне, это хороший компонент, который раньше можно было реализовать при помощи RecyclerView.
Особенно компонент будет полезен приложениям, которые работают на планшетах. Чуть подробнее можно почитать о нём тут.5 158
⚡Бесплатные уроки для всех, кто интересуется языками JVM!
11 марта - Демо-урок на тему «Эффекты в Scala»
На занятии рассмотрим понятие эффекта и сложности, которые могут возникать при их наличии. Также введем понятие функционального эффекта, рассмотрим его свойства и реализуем свой небольшой функциональный эффект.
Регистрация: https://otus.pw/5aaN/
25 марта - Демо-урок «Событие как основной тип данных в системе»
Узнаем какие бывают виды взаимодействия между разными частями системы, их плюсы и минусы. На примере задачи познакомимся с архитектурой, основанной на событиях. Реализуем задачу с помощью Aкка persistence и Scala, узнаем когда и почему полезно использовать событийно ориентированную архитектуру.
Регистрация: https://otus.pw/weSr/
🌋 Для регистрации на вебинары необходимо пройти тестирование, ошибки разберем на занятии!
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
