#ThreeTen #Backport #JakeWharton
ThreeTenABP 1.1.2
Вышло очередное обновление ThreeTenABP - обертка библиотеки ThreeTen бекпорта Java 8 Data/Time API. Релиз обновил базу данных по временным зонам и обновил базируемую версию ThreeTen до 1.3.8
ThreeTenABP 1.1.2
Вышло очередное обновление ThreeTenABP - обертка библиотеки ThreeTen бекпорта Java 8 Data/Time API. Релиз обновил базу данных по временным зонам и обновил базируемую версию ThreeTen до 1.3.8
GitHub
Release 1.1.2 · JakeWharton/ThreeTenABP
Version 1.1.2
Forwarded from The Daily Kotlin (Ruslan Ibragimov)
This media is not supported in your browser
VIEW IN TELEGRAM
А Kotlin уже три годика 🎉
#Retrofit #Coroutines #Kotlin
Retrofit meets coroutines
В Retrofit приходит официальная поддержка Coroutines от автор библиотеки. Пока изменения доступны только в snapshot версии, но уже в следующем релизе их можно будет начать корутинить ваши REST интерфейсы.
Появились новые возможности:
1️⃣ suspend функция
2️⃣ suspend функция
3️⃣ Добавление suspend непосредственно к функции в интерфейсе
Выглядеть использование будет так:
Retrofit meets coroutines
В Retrofit приходит официальная поддержка Coroutines от автор библиотеки. Пока изменения доступны только в snapshot версии, но уже в следующем релизе их можно будет начать корутинить ваши REST интерфейсы.
Появились новые возможности:
1️⃣ suspend функция
Call<T>.await() : T2️⃣ suspend функция
Call<T>.awaitResponse(): Response<T>3️⃣ Добавление suspend непосредственно к функции в интерфейсе
Выглядеть использование будет так:
interface SpaceXApi { @GET("rockets") suspend fun getRockets(): Call<List<Rocket>>}val api = retrofit.create<SpaceXApi>()runBlocking { val rockets = api.getRockets() rockets.forEach(::println)}zsmb.co
Retrofit meets coroutines - zsmb.co
Retrofit's coroutine support has been a long time coming, and it's finally coming to completion. Take a look at how you can use it to neatly integrate networking into an application built with coroutines.
#AlarmManager
Using AlarmManager like a pro
В приложениях бывает необходимым вызывать событие в определенное время или с периодичностью, независимо от работы приложения. Для в Android служит AlarmManager. Но он имеет много подводных камней:
👉 Время срабатывания вызова не является гарантировано точным
👉 Особенности работы в режиме при ограничение системой потребления энергии (Doze, App Standby, Adaptive Battery и пр.)
👉 Сброс всех alarm при перезагрузке устройства и смене времени
👉 При создание alarm в прошлом он сработает мгновенно
В статье описывается решения как правильно восстанавливать alarm при их затирании системой
Using AlarmManager like a pro
В приложениях бывает необходимым вызывать событие в определенное время или с периодичностью, независимо от работы приложения. Для в Android служит AlarmManager. Но он имеет много подводных камней:
👉 Время срабатывания вызова не является гарантировано точным
👉 Особенности работы в режиме при ограничение системой потребления энергии (Doze, App Standby, Adaptive Battery и пр.)
👉 Сброс всех alarm при перезагрузке устройства и смене времени
👉 При создание alarm в прошлом он сработает мгновенно
В статье описывается решения как правильно восстанавливать alarm при их затирании системой
Medium
Using AlarmManager like a pro
All of us must have used AlarmManager in some way but there a lot of times when the alarm gets cancelled or there are bugs in the…
#RxJava #Lifecycle #Uber
RxJava2 AutoDispose by Uber was opened
Uber открыла доступ к своей библиотеке AutoDispose. Она позволяете автоматически вызывать
ПОд капотом все выполняется с помощью метода-фабрики autoDisposable() следующим образом:
Поддерживается основные компоненты Android с жизненным циклом, Architecture Components, RxLifecycle, есть расширения для Kotlin и тестов
RxJava2 AutoDispose by Uber was opened
Uber открыла доступ к своей библиотеке AutoDispose. Она позволяете автоматически вызывать
dispose() вашим ObservableПОд капотом все выполняется с помощью метода-фабрики autoDisposable() следующим образом:
myObservable .doStuff() .as(autoDisposable(this)) // The magic .subscribe(s -> ...);Поддерживается основные компоненты Android с жизненным циклом, Architecture Components, RxLifecycle, есть расширения для Kotlin и тестов
GitHub
GitHub - uber/AutoDispose: Automatic binding+disposal of RxJava streams.
Automatic binding+disposal of RxJava streams. Contribute to uber/AutoDispose development by creating an account on GitHub.
#GooglePlay #AndroidVitals
Monitor and improve app performance with Android vitals
Запись доклада от Google Play Console команды, в котором рассказывается как такие факторы как стабильность, рендеринг и потребление батареи влияет на скорость ваших приложений со технической и бизнес сторон.
Также демонстрируется как эффективно использовать информацию из Android Vitals в Google Play консоле для того чтобы понимать производительность вашего приложения и как понять что у вас есть проблемы.
В рамках видео также будет сделано демо Android Vitals
Monitor and improve app performance with Android vitals
Запись доклада от Google Play Console команды, в котором рассказывается как такие факторы как стабильность, рендеринг и потребление батареи влияет на скорость ваших приложений со технической и бизнес сторон.
Также демонстрируется как эффективно использовать информацию из Android Vitals в Google Play консоле для того чтобы понимать производительность вашего приложения и как понять что у вас есть проблемы.
В рамках видео также будет сделано демо Android Vitals
YouTube
Monitor and improve app performance with Android vitals
In this recording of an App Hub Live session, the Google Play Console team discusses how factors such as stability, rendering, and battery consumption affect your app’s performance from both a technical and business perspective. The team demonstrates how…
#Kotlin #Coroutines #BestPractices
Android Kotlin Coroutine Best Practices
Рекомендации по использованию корутин:
👉 Обрабатывайте жизненный цикл: необходимо останавливать корутины по выходу из Activity/Fragment
👉 Обрабатывайте исключения
👉 Не используйте напрямую CoroutineDispatcher из Dispatchers. Создавайте интерфейс через который вы будете представлять различные CoroutineDispatcher, а вот в его реализации можете делать брать их уже откуда хотите.
👉 Не забывайте что корутины - это асинхронный подход и не стоит модифицировать данные из нескольких корутин
👉 Правильно настраивайте правила для ProGuard
👉 Для обратной совместимости с Java 8+ конвертируете корутины в CompletableFuture с помощью CoroutineScope.future (нужна подключенная библиотека
👉 Многий библиотеки не требуют задание Dispatcher чтобы выполняться в другом потоке, так как они уже по умолчанию внутри себя работают на другом потоке. Например Retrofit
Android Kotlin Coroutine Best Practices
Рекомендации по использованию корутин:
👉 Обрабатывайте жизненный цикл: необходимо останавливать корутины по выходу из Activity/Fragment
👉 Обрабатывайте исключения
👉 Не используйте напрямую CoroutineDispatcher из Dispatchers. Создавайте интерфейс через который вы будете представлять различные CoroutineDispatcher, а вот в его реализации можете делать брать их уже откуда хотите.
👉 Не забывайте что корутины - это асинхронный подход и не стоит модифицировать данные из нескольких корутин
👉 Правильно настраивайте правила для ProGuard
👉 Для обратной совместимости с Java 8+ конвертируете корутины в CompletableFuture с помощью CoroutineScope.future (нужна подключенная библиотека
kotlinx-coroutines-jdk8). На Android это будет работать только для Android 7.0+👉 Многий библиотеки не требуют задание Dispatcher чтобы выполняться в другом потоке, так как они уже по умолчанию внутри себя работают на другом потоке. Например Retrofit
Medium
Android Kotlin Coroutine Best Practices
The is a continuously maintained set of best practices for using Kotlin Coroutines on Android. Please comment below if you have any…
#ProGuard #Kotlin #Coroutines
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}-keepclassmembernames class kotlinx.** { volatile <fields>; }#AndroidStudio
Is Your Android Studio Always Slow? 🚀Here’s How to Speed Up Immediately
Android Studio (AS) - это не самый быстрый софт. Обрастая новым функционалом каждый релиз, она становится все тяжелее и медленнее. Это печалит всех 😞.
Есть пара рекомендаций, чтобы оптимизировать работу AS:
👉 Отключите неиспользуемые плагины
👉 Используйте Gradle Offline режим
👉 Отключите параллельную режим Gradle
👉 Отключите Instant Run
👉 Используйте физические устройства, а не эмуляторы
Is Your Android Studio Always Slow? 🚀Here’s How to Speed Up Immediately
Android Studio (AS) - это не самый быстрый софт. Обрастая новым функционалом каждый релиз, она становится все тяжелее и медленнее. Это печалит всех 😞.
Есть пара рекомендаций, чтобы оптимизировать работу AS:
👉 Отключите неиспользуемые плагины
👉 Используйте Gradle Offline режим
👉 Отключите параллельную режим Gradle
👉 Отключите Instant Run
👉 Используйте физические устройства, а не эмуляторы
Medium
⚡ Is Your Android Studio Always Slow? 🚀Here’s How to Speed Up Immediately.
A very quick and effective trick to boost Android Studio
#Library
TimetableLayout is a RecyclerView.LayoutManager to display the timetable for Android
LayoutManager для RecyclerView, позволяющий отображать вам ваш контент в виде расписания
TimetableLayout is a RecyclerView.LayoutManager to display the timetable for Android
LayoutManager для RecyclerView, позволяющий отображать вам ваш контент в виде расписания
GitHub
GitHub - MoyuruAizawa/TimetableLayout: TimetableLayout is a RecyclerView.LayoutManager to display the timetable for Android.
TimetableLayout is a RecyclerView.LayoutManager to display the timetable for Android. - MoyuruAizawa/TimetableLayout
#CodeQuality #Facebook #MachineLearning
Facebook Infer is a static analysis tool base on machine learning
Facebook открыла доступ к инструменту статического анализа кода, который использует алгоритмы на основе машинного обучения и позволяет анализировать код, самообучаясь и обнаруживать массу проблем, которые простым статическим анализатором неподвластны.
Описание принципов работу Infer
Попробуйте Infer онлайн
Facebook Infer is a static analysis tool base on machine learning
Facebook открыла доступ к инструменту статического анализа кода, который использует алгоритмы на основе машинного обучения и позволяет анализировать код, самообучаясь и обнаруживать массу проблем, которые простым статическим анализатором неподвластны.
Описание принципов работу Infer
Попробуйте Infer онлайн
Fbinfer
Infer Static Analyzer | Infer | Infer
A tool to detect bugs in Java and C/C++/Objective-C code before it ships
#GooglePlay
Expanding target API level requirements in 2019
Google вновь поднимает target sdk для всех приложений в Google Play. Теперь минимальная версия будет Android 9.0 (API 28) для всех приложений:
❗С августа - для всех новых
❗С ноября - для всех обновляемых
Также пользователи будут получать предупреждение при установке приложений, о том что оно не адаптировано под новые версии Android. Работать это будет по следующим правилам:
❗С августа новые приложения будут получат предупреждения если target sdk < 26 (Android 8.0)
❗С ноября новые версии существующих приложений получат предупреждения если target sdk < 26
Если версия Android вашего устройства меньше обязательной target sdk, то предупреждения вы не увидите. Каждый год минимальная target sdk будет повышаться до следующей мажорной версии ОС.
Как вы относитесь к таким изменениям?
Expanding target API level requirements in 2019
Google вновь поднимает target sdk для всех приложений в Google Play. Теперь минимальная версия будет Android 9.0 (API 28) для всех приложений:
❗С августа - для всех новых
❗С ноября - для всех обновляемых
Также пользователи будут получать предупреждение при установке приложений, о том что оно не адаптировано под новые версии Android. Работать это будет по следующим правилам:
❗С августа новые приложения будут получат предупреждения если target sdk < 26 (Android 8.0)
❗С ноября новые версии существующих приложений получат предупреждения если target sdk < 26
Если версия Android вашего устройства меньше обязательной target sdk, то предупреждения вы не увидите. Каждый год минимальная target sdk будет повышаться до следующей мажорной версии ОС.
Как вы относитесь к таким изменениям?
Android Developers Blog
Expanding target API level requirements in 2019
In a previous blog we described how API behavior changes advance the security and privacy protections of Android, and include user experience improvements that prevent apps from accidentally overusing resources like battery and memory.
Since November 2018…
Since November 2018…
#AndroidStudio #Marble #ApplyChanges
Android Studio Project Marble: Apply Changes
Google наконец-то прислушалась к мольбам Android разработчиков о улучшение Android Studio в плане стабильности, фикса багов и чрезмерного потребления ресурсов. результат этого - Project Marble, в рамках которого на протяжение релизов Android Studio 3.4 и дальше будет происходить работы над стабилизацией.
Первая статья в серии описывает падение Instant Run и замену его на Apply Changes, доступный в Android Studio 3.5. необходимость нового механизма возникла в том что Instant Run не справлялась со сложными приложениями.
Отличия в Apply Changes следующие:
👉 Минимальная поддерживаемая версия Android 8.0 Oreo
👉 Apply Changes не модифицирует APK во время сборки, а опирается на механизмы в Android 8.0, которые позволяют переопределять классы "на лету"
👉 Оптимизация механизма сравнения установленного и нового APK для вычисления разницы
Android Studio Project Marble: Apply Changes
Google наконец-то прислушалась к мольбам Android разработчиков о улучшение Android Studio в плане стабильности, фикса багов и чрезмерного потребления ресурсов. результат этого - Project Marble, в рамках которого на протяжение релизов Android Studio 3.4 и дальше будет происходить работы над стабилизацией.
Первая статья в серии описывает падение Instant Run и замену его на Apply Changes, доступный в Android Studio 3.5. необходимость нового механизма возникла в том что Instant Run не справлялась со сложными приложениями.
Отличия в Apply Changes следующие:
👉 Минимальная поддерживаемая версия Android 8.0 Oreo
👉 Apply Changes не модифицирует APK во время сборки, а опирается на механизмы в Android 8.0, которые позволяют переопределять классы "на лету"
👉 Оптимизация механизма сравнения установленного и нового APK для вычисления разницы
Medium
Android Studio Project Marble: Apply Changes
A deep dive into how the Android Studio team built Apply Changes, the successor to Instant Run.
#Assembler #Hardcore
Как мы писали Android-приложение на ассемблере
Какой язык выбрать чтобы написать "Hello World!" на Android. Обычный программист напишет на Java, хипстер на Kotlin, но самые серьезные, сторонники подхода Чака Норриса выберут ассемблер. Автор статьи из суровых и решил повторить это за Чаком! Больше подробностей о том как это сделать вы найдете по ссылке.
Как мы писали Android-приложение на ассемблере
Какой язык выбрать чтобы написать "Hello World!" на Android. Обычный программист напишет на Java, хипстер на Kotlin, но самые серьезные, сторонники подхода Чака Норриса выберут ассемблер. Автор статьи из суровых и решил повторить это за Чаком! Больше подробностей о том как это сделать вы найдете по ссылке.
Tproger
Как мы писали Android-приложение на ассемблере
Статья на Tproger — Как мы писали Android-приложение на ассемблере
Какую архитектуру использует ваше приложение?
Final Results
36%
MVP
40%
MVVM
5%
MVI
11%
Нет архитектуры
8%
Прочее
#Conference #Mobius
Mobius Piter 2019
22-23 мая в Санкт-Петербурге пройдет конференция Mobius в рамках которой вы сможете послушать доклады от спикеров из крупнейших компаний.
Но самое главное для меня - я выступлю с докладом о лучших практиках в корутинах: как не допустить ошибок при их использование на Android, и как писать код таким образом. что корутины дали максимальную эффективность! Буду рад увидеть вас в зале 😁
Скидка на билет по промокоду 10% AndroidBroadcastPromo
Mobius Piter 2019
22-23 мая в Санкт-Петербурге пройдет конференция Mobius в рамках которой вы сможете послушать доклады от спикеров из крупнейших компаний.
Но самое главное для меня - я выступлю с докладом о лучших практиках в корутинах: как не допустить ошибок при их использование на Android, и как писать код таким образом. что корутины дали максимальную эффективность! Буду рад увидеть вас в зале 😁
Скидка на билет по промокоду 10% AndroidBroadcastPromo
Mobius 2026 Spring. Конференция по мобильной разработке
Mobius 2026 Spring | Конференция по мобильной разработке
Mobius 2026 Spring. Единственная в России профильная IT-конференция для разработчиков мобильных приложений. Android, iOS, Flutter, Kotlin Multiplatform, кроссплатформенная разработка — в десятках докладов, воркшопов и дискуссий.
Скидка на билеты Mobius Piter 2019 по промокоду AndroidBroadcastPromo - 10%🔥
Mobius 2026 Spring. Конференция по мобильной разработке
Mobius 2026 Spring | Конференция по мобильной разработке
Mobius 2026 Spring. Единственная в России профильная IT-конференция для разработчиков мобильных приложений. Android, iOS, Flutter, Kotlin Multiplatform, кроссплатформенная разработка — в десятках докладов, воркшопов и дискуссий.
Большинство современных проектов используют RxJava либо Kotlin Coroutines.
Знаете ли вы разницу между Schedulers.computations() и Schedulers.io()? Между Dispatchers.Default и Dispatchers.IO? Чур документацией не пользоваться!
Знаете ли вы разницу между Schedulers.computations() и Schedulers.io()? Между Dispatchers.Default и Dispatchers.IO? Чур документацией не пользоваться!
Final Results
52%
Да
39%
Нет
9%
Не пользуюсь Rx и корутинами
#Rx #Coroutines #Concurrency
Understanding CPU- and I/O-bound for asynchronous operations
В современных приложениях мы выносим обработку долгих операций на фоновые потоки. Знаете ли Вы какие операции надо запускать на этих пулах потоков, а самое главное почему? Почему не использовать единый пул для всех фоновых операций? Зачем в Kotlin Coroutines и RxJava есть понятия I/O-bound и CPU-bound.
Причиной этому является как I/O операции ведут себя по сравнению к CPU интенсивным операция. Чтение данных из файлов, потоков, сокетов или сети часто содержит много ожидания: подключение к источнику, дождаться ответа и только потом идет его реальная передача, которая может также приостанавливаться из-за низкой скорости или загруженности. Операции не связанные с чтение не из оперативной памяти вызывают IOwait - системный вызов, который сообщает процессору о необходимости приостановить выполнение текущего потока, пока данные станут доступны или будут успешно переданы.
Важно помнить, что потоки, выполняющие I/O операции, проводят значительную часть времени в ожидании. При маленьком пуле потоков, выделенных для таких операций у вас может быть простой приложения.
С другой стороны, если рассмотреть операции которые интенсивно используют CPU, например процессинг изображений, тяжелые расчеты и пр., то для таких операций нет блокирующих событий как IOwait и потоки приостанавливаются только на основе механизма распределения ресурсов в ОС.
Подведя итоги описанной выше разницы работы задача с IO и CPU можно понять что:
👉 CPU и I/O операции стоит выполнять в разных пулах потоков
👉 пул для CPU интенсивных операций должен опираться на количество ядер в устройстве и не превышать его
👉 пул для I/O операций может быть довольно большим
Рассмотрим пример:
1️⃣ Скачаем картинку из сети
2️⃣ Сделаем ей blur
3️⃣ Отобразим ее на устройстве
Мы имеем 3 разных пула, которы надо использовать:
1️⃣ I/O
2️⃣ CPU
3️⃣ Main
Реализация примера на корутинах:
Реализация на RxJava:
В дополнение можно сказать что Coroutine выигрывают еще в том что они не блокируют потоки и позволяют во время ожидания выполняться на них других операциям, что позволяет более эффективно использовать пулл I/O.
Understanding CPU- and I/O-bound for asynchronous operations
В современных приложениях мы выносим обработку долгих операций на фоновые потоки. Знаете ли Вы какие операции надо запускать на этих пулах потоков, а самое главное почему? Почему не использовать единый пул для всех фоновых операций? Зачем в Kotlin Coroutines и RxJava есть понятия I/O-bound и CPU-bound.
Причиной этому является как I/O операции ведут себя по сравнению к CPU интенсивным операция. Чтение данных из файлов, потоков, сокетов или сети часто содержит много ожидания: подключение к источнику, дождаться ответа и только потом идет его реальная передача, которая может также приостанавливаться из-за низкой скорости или загруженности. Операции не связанные с чтение не из оперативной памяти вызывают IOwait - системный вызов, который сообщает процессору о необходимости приостановить выполнение текущего потока, пока данные станут доступны или будут успешно переданы.
Важно помнить, что потоки, выполняющие I/O операции, проводят значительную часть времени в ожидании. При маленьком пуле потоков, выделенных для таких операций у вас может быть простой приложения.
С другой стороны, если рассмотреть операции которые интенсивно используют CPU, например процессинг изображений, тяжелые расчеты и пр., то для таких операций нет блокирующих событий как IOwait и потоки приостанавливаются только на основе механизма распределения ресурсов в ОС.
Подведя итоги описанной выше разницы работы задача с IO и CPU можно понять что:
👉 CPU и I/O операции стоит выполнять в разных пулах потоков
👉 пул для CPU интенсивных операций должен опираться на количество ядер в устройстве и не превышать его
👉 пул для I/O операций может быть довольно большим
Рассмотрим пример:
1️⃣ Скачаем картинку из сети
2️⃣ Сделаем ей blur
3️⃣ Отобразим ее на устройстве
Мы имеем 3 разных пула, которы надо использовать:
1️⃣ I/O
2️⃣ CPU
3️⃣ Main
Реализация примера на корутинах:
launch(Dispatchers.IO) { val image = api.fetchImageAsync(url).await() val blurred =withContext(Dispatchers.Default) {
image.blur() } withContext(Dispatchers.Main) { displayImage(blurred) }}Реализация на RxJava:
api.fetchImageObservable(url) .subscribeOn(Schedulers.io() .observeOn(Schedulers.computation()) .map { blurImageSync(it) } .observeOn(AndroidSchedulers.mainThread()) .subscribe { displayImage(it) }В дополнение можно сказать что Coroutine выигрывают еще в том что они не блокируют потоки и позволяют во время ожидания выполняться на них других операциям, что позволяет более эффективно использовать пулл I/O.