Android Broadcast – Telegram
Android Broadcast
14.4K subscribers
3.68K photos
368 videos
11 files
6.1K links
Подборка новостей и статей для Android разработчиков.

Реклама и связь с автором @ab_manager

РКН https://abdev.by/rkn_tg_ab #MQRZR
Download Telegram
#Glide #Image #Cache

Best strategy to load images using Glide

Glide - это довольно популярное решение для загрузки изображений. Я использую именно за его широкие возможности, поддержку добавления загрузки и кэширования собственных типов данных и широкие возможности по пост обработки изображения перед показом картинки пользователю.

В статье выше нашел пару интересных моментов по использованию Glide:
👉 Добавляйте url превью картинки более мелкого размера (thumbnail), это позволит показать результат пользователю быстрее но в более низком качестве
👉 Выполняйте периодическую очистку кэша. Например, можно создать периодическую Work, использую WorkManager, которая будет очищать старый кэш.
👍1
Android Broadcast
Какую библиотеку для загрузки изображений используете вы в своих последних приложениях?
По итогам опроса о популярности библиотеки для загрузки изображений победителем стал Glide 🎉🎉🎉
👍1
#ART #Performance

Improving app performance with ART optimizing profiles in the cloud

В Android 9.0 Pie была запущены оптимизирующие профили ART в Play Cloud, которое позволило ускорить запуск приложения в среднем около 15% без необходимости какой-либо оптимизации со стороны разработчиков приложений.

В статье подробно освещается механизм работы эту функции:
👉 Сбор информации для профилей
👉 DEX метадата
👉 Структура профилей
👍1
#Dagger #DependencyInjection #Square

Dagger Assisted Injection

Для всех те кто решал проблему Dagger 2 с передачей параметров в зависимости, Square сделали толковое решение - Assisted Inject, которое позволяет избавиться от создания дополнительных компонентов или не задавать зависимости через setter-ы после их создания.

Рассмотрим пример:
class TextPresenter
@AssistedInject constructor(
@Assisted val view: TextView,
@Assisted val text: String,
val textDecorator: TextDecorator
)

Параметры view и text не находятся в графе зависимостей и поэтому мы не можем получить оттуда, и мы помечаем их с помощью @Assisted, что говорит о том что они будут задаваться динамически.

Следующим шагом нам нужна фабрика для создания нашей зависимости:
class TextPresenter {
@AssistedInject.Factory interface Factory {
fun create(
view: TextView,
text: String
): TextPresenter
}
}

Фабрика позволит нам создавать зависимости, передавая туда необходимые параметры.

Библиотека сейчас находится в версии 0.3.3, но работает без проблем, проверено личной мной на production проекте.

Все подробности полной реализации вы можете найти в статье.

Gtihub Assisted Inject
👍1
Считаете ли Вы, что Android разработчик должен пользоваться Android устройством, чтобы понимать платформу как пользователь?
Final Results
56%
Однозначно использовать Android!
27%
Android, iOS, да хоть Windows Phone, всё равно
17%
Хочу увидеть результаты
👍1
#Dagger #LibUpdates #DependencyInjection

Вышел Dagger 2.22

Вышел Dagger 2.22. В новом релизе нас ждут:
👉 Теперь создавать компоненты можно не только с помощью Builder (помечая интерфейс @Component.Builder), но и фабрикой с единственным методом, принимающим все параметры (для этого используйте @Component.Factory)
👉 @BindsInstance теперь можно применять к параметрам метода. Это сделано для поддержка Factory у Component
👉 Публичные модули могут включать непубличные
👉 Улучшение производительности процессора аннотаций и сгенерированного кода
👉 Прочие мелкие улучшения

Версия уже доступна и Вы можете начать обновление!
👍1
#Firebase #MLKit #MachineLearning

ML Kit expands into NLP with Language Identification and Smart Reply

Firebase ML Kit - это простой способ интеграции машинного обучения в ваше приложение. Разработчики этой библиотеки добавили поддержку новых функций: распознавание языков и Smart Reply.

Распознавание языков
Это API позволяет вам определять язык текста. Поддерживается 110 языков из разных групп: латиница, кириллица, иероглифы и пр.

Smart Reply
С помощью Smart Reply вы можете генерировать ответы на основе переписки. Например, можно использовать это для быстрых ответах в уведомлениях.
В текущее время поддерживается только английский язык.
👍1
#AndroidQ

Android Q Beta 2 update

Вышла вторая бета Android 10 Q. Изменения следующие:
👉 Scoped Storage теперь включено по умолчанию для устанавливаемых приложений
👉 Bubbles: новый способ многозадачности, построенный на основе системы уведомлений
👉 Эмулятор для сгибаемых (Foldable) устройств (доступно в последней canary Android Studio 3.5)
👉 Улучшение в UI шаринга: теперь можно задать заголовок или превью картинку
👉 Управление микрофоном: теперь можно задать какой микрофон использовать (если их несколько на устройстве) и задавать радиус зоны записи
👉 Больше ограничений на закрытое Android API
👉 Добавлены новые роли в RoleManager: ROLE_ASSISTANT, ROLE_CALL_REDIRECTION и ROLE_CALL_SCREENING
👉 Улучшения API
👉 Фикс багов и оптимизация

Уже доступны обновленные SDK, эмуляторы и прошивки для Pixel
👍1
Bubbles на примере уведомлений от мессенджера
👍1
#MobilePeople #Podcast #AndroidQ #GoogleIO

Mobile People Talks #0: Google I/O & Android Q

Первый выпуск подкаста Mobile People Talks вышел и в нем мы с коллегами говорили о Google I/O, Android Q и Fuchsia.

Подкаст на iTunes
Подкаст на Google Podcast
Подкаст на SoundCloud

Чтобы следить за новостями подписывайтесь на канал Mobile People Talks

Спойлер: На подходе уже второй выпуск в рамках которого мы поговорим о Flutter, зададим вопросы Саше Денисову, который сейчас занимается развитием этой экспертизы в EPAM
👍1
Слушаете ли вы профессиональные подкасты хотя бы раз в месяц?
Final Results
57%
Да
43%
Нет
👍1
#AndroidDevSipummit #Conference

Android Dev Summit 2019 пройдёт 23-24 октября в Калифорнии, США. Нас ожидают доклады от инженеров из Google и анонсы.
👍1
#GooglePlay #Subnoscriptions #GooglePlayBilling

Subnoscriptions 101 for Android Apps

Рассказ о серии видео Subnoscriptions 101 в которой подробно рассматриваются различные аспекты подписок в Google Play:
1️⃣ Understanding Subnoscriptions - описание терминоголоии
2️⃣ Subnoscription Purchase Flow - процесс покупки
3️⃣ Real-time Developer Notifications - возможность получения уведомлений о состоянии подписок пользователя
4️⃣ Upgrade and Downgrade - повышение/понижение подписок через Google Play Billing Library
5️⃣ Grace Period - возможность давать пользователю использовать все преимущества подписки если автоматическая оплата не прошла
6️⃣ Account Hold - возможность предоставления доступа к контенту приложения если у пользователя не прошла оплата подписки, но раньше он ей пользовался
7️⃣ Cancel and Restore - отмена и восстановление подписок
8️⃣ Defer Billing - предоставление временного бесплатного доступа (например при акциях)

Все видео в серии небольшого размера (1-3 минуты)
👍1
#Kotlin #Coroutines #Channels

Kotlin: Diving in to Coroutines and Channels

Прекрасный рассказ о разнице между работой асинхронности на основе Java Thread и Kotlin Coroutines на примере работы кофейни. В статье также рассматривается что значит "шаринг памяти через коммуникацию" на основе Channel.
👍1
#Kotlin #Coroutines #Exceptions

Managing exceptions in nested coroutine scopes

Обработка исключений при выполнение вложенных корутин не так очевидна как кажется и имеет свою специфику.

Например, что будет записано в файл в результате выполнения кода?
GlobalScope.launch {
val text = try {
async<String> {
throw Exception("Test")
}.await()
} catch (e: Exception) {
"error text"
}
writeToFile(text) // Suspend function
}

Правильный ответ - ничего.

Причиной тому особенности Structured Concurrency. Когда происходит исключение в async то происходит следующее:
оно передаётся во все родительские и дочерние корутины, которые останавливают свое выполнение, а те в свою очередь останавливают все корутины по аналогичному принципы.

Замечание: Здесь опущена возможность, что можно задать свой собственный CoroutineExceptionHandler в CoroutineContext

Есть несколько способ обойти это:
👉 При создание CoroutineScope используйте SupervisorJob, которая не останавливает дочерние корутины
👉 Для переключения CoroutineContext используйте withContext() вместо launch/async
👉 Выполняйте корутины, который бросают исключения в отдельной CoroutineScope. Создать такой scope можно с помощью функции coroutineScope()

Больше подробностей ищите в статье!
👍1
#AndroidAcademy #GDGMinsk #Architecture

Android Academy Minsk - Architecture Part 1 of 2

Сегодня, 8 апреля в 19.00, пройдет очередная лекция в рамках курса Android Academy Advanced в Минске. Вы сможете узнать о том как строить архитектуру приложения и какие подходы используют опытные разработчики.

Участие бесплатное, по предварительной регистрации. Количество мест ограничено!

Для всех тех кто не сможет попасть лекцию в течении нескольких дней будет доступна видео запись лекции на YouTube канале Android Academy Minsk.
👍1
How to detect if the android keyboard is open

В Android нет возможности понять показывается ли сейчас клавиатура на экране. В статье описывается лайфхак, который на основе видимой зоне на экране, и ViewTreeObserver.OnGlobalLayoutListener, добавив щепотку Lifecycle из Architecture Components, можно определять видна ли клавиатура.

Решение не без изъянов, но позволяет уже решить в проблема в самых распространенных случаях
#MVVM #Architecture #BestPractices #ArchComponents

Our Way to MVVMI and Mistakes We Made When Implementing MVVM

Лучше учиться на ошибках других. Поэтому запомните из боли разработчиков их опыт интеграции и примите следующий правила (что НЕ стоит делать) при работе с MVVM на основе Arch Components:
Передавать LiveData в качестве параметра в репозиторий и обновлять его там
Комбинировать бизнес логику и логику представления в ViewModel
Полагаться только на ViewModel для сохранения состояния между пересозданием Activity/Fragment
Не сбрасывать слушатели Repository, когда уничтожается View
Получать данные из ViewModel в View с помощь getter, а не реагировать на изменение данных через LiveData
👍1