Распознавание рисунков при помощи ML Kit
#статьи #разработка
Довольно интересной областью разработки является машинное обучение. Если вы хотели попробовать эту область, но не знали как к ней подступиться, то предлагаю вам этот вариант.
Автор рассматривает Digital Ink Recognition API из ML Kit, которое распознаёт написанный вручную текст или изображение с экрана. По его словам, результаты довольно точные.
Любопытно, что приложение также может работать оффлайн, правда при этом надо скачать модель в виде 20 мегабайт.
Описание того, как сделать такое приложение и ссылка на готовое можно найти тут.
#статьи #разработка
Довольно интересной областью разработки является машинное обучение. Если вы хотели попробовать эту область, но не знали как к ней подступиться, то предлагаю вам этот вариант.
Автор рассматривает Digital Ink Recognition API из ML Kit, которое распознаёт написанный вручную текст или изображение с экрана. По его словам, результаты довольно точные.
Любопытно, что приложение также может работать оффлайн, правда при этом надо скачать модель в виде 20 мегабайт.
Описание того, как сделать такое приложение и ссылка на готовое можно найти тут.
Результаты конкурса «Бесконечная строка»
#конкурс
Итак, самое время подвести итог нашего конкурса.
В этот раз в конкурсе участвовало 65 решений. Довольно много было и решений, которые не удовлетворяли условиям конкурса: присутствовали и удаления return из функции, и ошибки каста Long в Int.
Такие решения не прошли отбор, так как условия чётко оговаривали правила того, что нельзя никак менять параметры функции, равно как и удалять return. 😊
В результате победили решения, которые имели 52 символа:
1) return(0..n-1).count{s[it.toInt()%s.length]=='a'}*1L — @Namolem
2) return(0..n.toInt()-1).count{s[it%s.length]=='a'}+0L — @amihusb
3) return(0..n.toInt()-1).count{s[it%s.length]=='a'}+0L — @luckycactus
Так как решения участников имеют однинаковую длину, то рандомное распределение призов выглядит следующим образом:
1) толстовка + сумка + мерч — достаются номеру 3, или @luckycactus
2) футболка + сумка + мерч — достаются номеру 2, или @amihusb
3) сумка + мерч — достаются номеру 1, или @Namolem
Ссылка на видео с рандомным распределением тут.
Спасибо команде Badoo на отличный мерч и призы.
Кроме того, отдельное спасибо @g_apollo и @KoteykaEvil за помощь в проверке заданий.
Также благодарю всех кто участвовал в конкурсе! И поздравляю победителей! 😎
Конкурс далеко не последний, поэтому вновь спрашиваю вас: какие призы вам были бы наиболее интересны при проведении подобных конкурсов? Напишите, пожалуйста, мне.
#конкурс
Итак, самое время подвести итог нашего конкурса.
В этот раз в конкурсе участвовало 65 решений. Довольно много было и решений, которые не удовлетворяли условиям конкурса: присутствовали и удаления return из функции, и ошибки каста Long в Int.
Такие решения не прошли отбор, так как условия чётко оговаривали правила того, что нельзя никак менять параметры функции, равно как и удалять return. 😊
В результате победили решения, которые имели 52 символа:
1) return(0..n-1).count{s[it.toInt()%s.length]=='a'}*1L — @Namolem
2) return(0..n.toInt()-1).count{s[it%s.length]=='a'}+0L — @amihusb
3) return(0..n.toInt()-1).count{s[it%s.length]=='a'}+0L — @luckycactus
Так как решения участников имеют однинаковую длину, то рандомное распределение призов выглядит следующим образом:
1) толстовка + сумка + мерч — достаются номеру 3, или @luckycactus
2) футболка + сумка + мерч — достаются номеру 2, или @amihusb
3) сумка + мерч — достаются номеру 1, или @Namolem
Ссылка на видео с рандомным распределением тут.
Спасибо команде Badoo на отличный мерч и призы.
Кроме того, отдельное спасибо @g_apollo и @KoteykaEvil за помощь в проверке заданий.
Также благодарю всех кто участвовал в конкурсе! И поздравляю победителей! 😎
Конкурс далеко не последний, поэтому вновь спрашиваю вас: какие призы вам были бы наиболее интересны при проведении подобных конкурсов? Напишите, пожалуйста, мне.
Android Lint Framework — введение
#разработка #статьи
Android Studio даёт довольно много инструментов для того, чтобы писать качественный код. Одним из таких является Lint: IDE подсказывает вам о каких-то неточностях в вашем коде и распространённых багах, к которым можем привести этот код.
Однако самым главным преимуществом является то, что каждый сам может написать свои правила для кода. 😎 Автор этой статьи описывает шаги для написания своего lint-правила:
🔹какие зависимости подключить;
🔹от какого класса наследоваться;
🔹как прописать типы классов, на которые будет распространяться правило;
🔹как применить написанное правило.
Также есть неплохой репозиторий от Uber, где содержится целый набор lint-проверок.
#разработка #статьи
Android Studio даёт довольно много инструментов для того, чтобы писать качественный код. Одним из таких является Lint: IDE подсказывает вам о каких-то неточностях в вашем коде и распространённых багах, к которым можем привести этот код.
Однако самым главным преимуществом является то, что каждый сам может написать свои правила для кода. 😎 Автор этой статьи описывает шаги для написания своего lint-правила:
🔹какие зависимости подключить;
🔹от какого класса наследоваться;
🔹как прописать типы классов, на которые будет распространяться правило;
🔹как применить написанное правило.
Также есть неплохой репозиторий от Uber, где содержится целый набор lint-проверок.
Как писать быстрые layouts
#разработка #статьи
Каким-бы функциональным и красивым не было приложение, мало кто из разработчиков хотел бы получить отзывы о том, что приложение работает медленно на устройстве пользователя.
Порой не просто сделать своё приложение «летающим» на всех устройствах, так как даже интерфейс системы работает с лагами на некоторых девайсах.
Но всё равно нужно держать в голове следующий момент: большинство устройсв сегодня имеют частоту обновления экрана в 60 fps, то есть на отрисовку одного кадра у нас есть 1/60 ≈ 16 миллисекунд. Для того, чтобы добиться этого результата у нас есть несколько инструментов и советов.
1) Используйте средства для диагностики проблем с layouts: Layout Inspector, Systrace, Android Profiler. Каждая из них достойна отдельного поста, поэтому пока только ссылки в документации.
2) Переиспользование layouts с merge.
Вынесение layout в xml и использование его при помощи include — довольно распространённая практика. Однако, многие забывают, что вместо корневого layout можно написать merge, который уберёт лишний уровень вложенности.
3) Используйте подходящий родительский layout.
Для этого пользуйтесь следующим правилом: для сложной верстки — ConstraintLayout, для вертикальных или горизонтальных последовательных элементов — LinearLayout, для расположения элементов одного над другим — FrameLayout.
4) Используйте ViewStub.
ViewStub — это хорошая альтернатива, когда вам нужно показать тяжёлый layout на экране или сделать этот показ отложенным. Он быстро рендерится и легко применяется, поэтому не забывайте про этот инструмент.
Подробнее про эти советы можно почитать тут.
#разработка #статьи
Каким-бы функциональным и красивым не было приложение, мало кто из разработчиков хотел бы получить отзывы о том, что приложение работает медленно на устройстве пользователя.
Порой не просто сделать своё приложение «летающим» на всех устройствах, так как даже интерфейс системы работает с лагами на некоторых девайсах.
Но всё равно нужно держать в голове следующий момент: большинство устройсв сегодня имеют частоту обновления экрана в 60 fps, то есть на отрисовку одного кадра у нас есть 1/60 ≈ 16 миллисекунд. Для того, чтобы добиться этого результата у нас есть несколько инструментов и советов.
1) Используйте средства для диагностики проблем с layouts: Layout Inspector, Systrace, Android Profiler. Каждая из них достойна отдельного поста, поэтому пока только ссылки в документации.
2) Переиспользование layouts с merge.
Вынесение layout в xml и использование его при помощи include — довольно распространённая практика. Однако, многие забывают, что вместо корневого layout можно написать merge, который уберёт лишний уровень вложенности.
3) Используйте подходящий родительский layout.
Для этого пользуйтесь следующим правилом: для сложной верстки — ConstraintLayout, для вертикальных или горизонтальных последовательных элементов — LinearLayout, для расположения элементов одного над другим — FrameLayout.
4) Используйте ViewStub.
ViewStub — это хорошая альтернатива, когда вам нужно показать тяжёлый layout на экране или сделать этот показ отложенным. Он быстро рендерится и легко применяется, поэтому не забывайте про этот инструмент.
Подробнее про эти советы можно почитать тут.
Jetpack Compose теперь в Alpha
#разработка #опрос
Сегодня вышла Alpha версия фреимворка Jetpack Compose.
Финальную версию обещают к 2021 году, ну а пока у нас есть:
🔹анимации;
🔹поддержка Constraint Layout;
🔹жесты;
🔹совместимость с текущими проектами и View;
🔹preview в Android Studio;
🔹и другие изменения.
Обновление довольно глобальное, с нетерпением жду beta версию. 😎
Примеры приложений уже есть тут, знаменитый Sunflower и новый для меня Tivi.
Подробнее про изменения можно почитать тут.
Ждёте Jetpack Compose?
#разработка #опрос
Сегодня вышла Alpha версия фреимворка Jetpack Compose.
Финальную версию обещают к 2021 году, ну а пока у нас есть:
🔹анимации;
🔹поддержка Constraint Layout;
🔹жесты;
🔹совместимость с текущими проектами и View;
🔹preview в Android Studio;
🔹и другие изменения.
Обновление довольно глобальное, с нетерпением жду beta версию. 😎
Примеры приложений уже есть тут, знаменитый Sunflower и новый для меня Tivi.
Подробнее про изменения можно почитать тут.
Ждёте Jetpack Compose?
Constraint Layout 2.0
#разработка #статьи #конференции
Constraint Layout — один из самых популярных компонентов Jetpack. И не зря: это отличный способ построения сложной вёрстки, причём для этого можно использовать только встроенный редактор (хотя иногда удобнее пописать код).
Совсем недавно ConstraintLayout 2.0 перешёл в релизную стадию, и теперь его можно смело затягивать в проект. Давайте же поговорим, что там появилось нового в отличии от первой версии.
🔹Flow — это «виртуальный» layout, который позволяет соединять view в цепочки, которые могут переходить на следующую строку при недостатке места. Очень полезная штука, особенно когда вы не знаете, насколько широкими и разными будут компоненты у вас на экране, но вам обязательно нужно показать их все. Так как это виртуальный layout, то он не добавляет новых view в иерархию, а просто содержит в себе несколько свойств для перечисленных ссылок на view. Почитать побольше об этом компоненте можно тут
🔹Layer — это так же «виртуальный» layout, который позволяет применять какие-то трансформации для view сразу для всей группы. Например, если вы хотите применить анимацию перемещения для большого числа view, то можно просто перечислить их в отдельный layer и применить анимацию только для layer.
🔹Motion Layout — наверное, одна из самых ожидаемых фич. Он позволяет создавать фактически любые анимации довольно простым и удобным способом благодяря встроенному в Android Studio редактору.
В одном пункте об этой фиче не расскажешь, но тут очень кстати ребята из Android Academy Minsk организуют митап, который рассказывает про Motion Layout и как его применять.
Пройдёт он 3 сентября в 19:00 по МСК. На митапе мы узнаем что такое MotionLayout и какие проблемы он может решать, изучим базовые вещи для анимаций а также пошагово в конце получим готовый экран Логина/Регистрации. Ссылка на регистрацию тут, а само мероприятие онлайн и бесплатно.
А почитать чуть-чуть больше об описанных изменениях можно в этой статье.
#разработка #статьи #конференции
Constraint Layout — один из самых популярных компонентов Jetpack. И не зря: это отличный способ построения сложной вёрстки, причём для этого можно использовать только встроенный редактор (хотя иногда удобнее пописать код).
Совсем недавно ConstraintLayout 2.0 перешёл в релизную стадию, и теперь его можно смело затягивать в проект. Давайте же поговорим, что там появилось нового в отличии от первой версии.
🔹Flow — это «виртуальный» layout, который позволяет соединять view в цепочки, которые могут переходить на следующую строку при недостатке места. Очень полезная штука, особенно когда вы не знаете, насколько широкими и разными будут компоненты у вас на экране, но вам обязательно нужно показать их все. Так как это виртуальный layout, то он не добавляет новых view в иерархию, а просто содержит в себе несколько свойств для перечисленных ссылок на view. Почитать побольше об этом компоненте можно тут
🔹Layer — это так же «виртуальный» layout, который позволяет применять какие-то трансформации для view сразу для всей группы. Например, если вы хотите применить анимацию перемещения для большого числа view, то можно просто перечислить их в отдельный layer и применить анимацию только для layer.
🔹Motion Layout — наверное, одна из самых ожидаемых фич. Он позволяет создавать фактически любые анимации довольно простым и удобным способом благодяря встроенному в Android Studio редактору.
В одном пункте об этой фиче не расскажешь, но тут очень кстати ребята из Android Academy Minsk организуют митап, который рассказывает про Motion Layout и как его применять.
Пройдёт он 3 сентября в 19:00 по МСК. На митапе мы узнаем что такое MotionLayout и какие проблемы он может решать, изучим базовые вещи для анимаций а также пошагово в конце получим готовый экран Логина/Регистрации. Ссылка на регистрацию тут, а само мероприятие онлайн и бесплатно.
А почитать чуть-чуть больше об описанных изменениях можно в этой статье.
Ещё немного о Jetpack Compose
#конференции
Ребята из Android Academy Global организуют митап, который посвящён теме Jetpach Compose. Доклады довольно крутые, учитывая свежесть технологии:
1) Jetpack Compose and MVI — Артур Бадретдинов, Squire Technologies. Доклад будет о том, как связать паттерн MVI и свежий Jetpack Compose. Посмотрим на примеры реализации и как это будет работать в связке.
2) Easing In and Out with Jetpack Compose — Артем Нестеренко, Loóna Inc. Новый подход даёт нам возможность легче создавать анимации. Также посмотрим на примеры кода и узнаем, каково же это писать анимации в декларативном стиле.
Мероприятие будет уже завтра, 01.09.2020 в 19:00, оно будет онлайн и бесплатно.
Ссылка на регистрацию тут, а ссылка на YouTube прилетит прям перед началом😎.
#конференции
Ребята из Android Academy Global организуют митап, который посвящён теме Jetpach Compose. Доклады довольно крутые, учитывая свежесть технологии:
1) Jetpack Compose and MVI — Артур Бадретдинов, Squire Technologies. Доклад будет о том, как связать паттерн MVI и свежий Jetpack Compose. Посмотрим на примеры реализации и как это будет работать в связке.
2) Easing In and Out with Jetpack Compose — Артем Нестеренко, Loóna Inc. Новый подход даёт нам возможность легче создавать анимации. Также посмотрим на примеры кода и узнаем, каково же это писать анимации в декларативном стиле.
Мероприятие будет уже завтра, 01.09.2020 в 19:00, оно будет онлайн и бесплатно.
Ссылка на регистрацию тут, а ссылка на YouTube прилетит прям перед началом😎.
Eventbrite
Android 11 #5 - Making friends with Jetpack Compose: MVI and Animation
Making friends with Jetpack Compose and MVI && Easing In and Out with Jetpack Compose
Kotlin Multiplatform Mobile теперь в Alpha
#разработка
Сегодня команда JetBrains анонсировала альфа версию Kotlin Multiplatform Mobile! Это SDK, который позволяет писать бизнес-логику приложений сразу под 2 платформы. 👍🏻 Альфа версия включает в себя также и плагин для Android Studio, который позволяет писать такие проекты.
Уже есть примеры приложений, которые использовали у себя KMM:
• Quizlet мигрировали бизнес-слой с JavaScript на KMM и значительно улучшили производительность как Android, так и iOS приложений;
• Fastwork начали использовать KMM для шаринга бизнес-логики и API для нескольких команд разработки;
• Yandex.Disk начали экспериментировать с небольшой фичи, после чего переписали всю синхронизацию данных на KMM.
Больше информации и полный текст анонса можно почитать тут.
Что-то конец лета выдал нам кучу новинок и теперь не знаешь даже, за что ухватиться в первую очередь 😄
#разработка
Сегодня команда JetBrains анонсировала альфа версию Kotlin Multiplatform Mobile! Это SDK, который позволяет писать бизнес-логику приложений сразу под 2 платформы. 👍🏻 Альфа версия включает в себя также и плагин для Android Studio, который позволяет писать такие проекты.
Уже есть примеры приложений, которые использовали у себя KMM:
• Quizlet мигрировали бизнес-слой с JavaScript на KMM и значительно улучшили производительность как Android, так и iOS приложений;
• Fastwork начали использовать KMM для шаринга бизнес-логики и API для нескольких команд разработки;
• Yandex.Disk начали экспериментировать с небольшой фичи, после чего переписали всю синхронизацию данных на KMM.
Больше информации и полный текст анонса можно почитать тут.
Что-то конец лета выдал нам кучу новинок и теперь не знаешь даже, за что ухватиться в первую очередь 😄
Зачем использовать Material Design тему?
#разработка #статьи
Любое Android-приложение соседствует с множеством других установленных приложений. Именно поэтому одним из принципов Material Design — это: «Все приложения должны иметь схожее поведение в рамках одной операционной системы».
Чтобы этого достичь, Google рекомендует использовать Material Design Components. Кроме этого, есть MaterialComponents Theme для приложения.
Давайте рассмотрим, почему вам стоит использовать именно её вместо AppCompat или стандартной библиотеки.
1️⃣Поддержка большего числа компонентов. MDC даёт довольно большое количество стандартных компонентов для показа, а также «расширяет» возможности текущих.
Например, MaterialButton предлагает гораздо больше стандартных стилей, чем обычный Button.
2️⃣Material Theming — это способ, который позволяет правильно кастомизировать приложение конкретно под ваш дизайн.
При помощи MDC можно настраивать цвета, тип шрифта, форму для приложения и использовать их при помощи атрибутов.
3️⃣Темная тема. Поддержка тёмной темы — это распространённая фича в приложении.
MDC позволяет настраивать этот паттерн из коробки, учитывая настройки пользователя в системе.
4️⃣Material Motion. MDC предлагает целый раздел о том, как должны быть устроены переходы между экранами. Их не очень сложно применить в проект, но при этом само приложение выглядит гораздо живее.
5️⃣Jetpack Compose. Уже не в первый, и далеко не в последний раз мы будем говорим об этом новом фреимворке. MDC уже готовит свою кодовую базу для перехода с Compose в будущем, что существенно ускорит миграцию нам.
В целом, переход на Material Theme довольно прост и даёт преимущества. На него стоит перейти только ради стилей для стандартных виджетов, которые особенно круто выглядят на последних версиях Android.
Подробнее про эти преимущества можно почитать в этой статье.
#разработка #статьи
Любое Android-приложение соседствует с множеством других установленных приложений. Именно поэтому одним из принципов Material Design — это: «Все приложения должны иметь схожее поведение в рамках одной операционной системы».
Чтобы этого достичь, Google рекомендует использовать Material Design Components. Кроме этого, есть MaterialComponents Theme для приложения.
Давайте рассмотрим, почему вам стоит использовать именно её вместо AppCompat или стандартной библиотеки.
1️⃣Поддержка большего числа компонентов. MDC даёт довольно большое количество стандартных компонентов для показа, а также «расширяет» возможности текущих.
Например, MaterialButton предлагает гораздо больше стандартных стилей, чем обычный Button.
2️⃣Material Theming — это способ, который позволяет правильно кастомизировать приложение конкретно под ваш дизайн.
При помощи MDC можно настраивать цвета, тип шрифта, форму для приложения и использовать их при помощи атрибутов.
3️⃣Темная тема. Поддержка тёмной темы — это распространённая фича в приложении.
MDC позволяет настраивать этот паттерн из коробки, учитывая настройки пользователя в системе.
4️⃣Material Motion. MDC предлагает целый раздел о том, как должны быть устроены переходы между экранами. Их не очень сложно применить в проект, но при этом само приложение выглядит гораздо живее.
5️⃣Jetpack Compose. Уже не в первый, и далеко не в последний раз мы будем говорим об этом новом фреимворке. MDC уже готовит свою кодовую базу для перехода с Compose в будущем, что существенно ускорит миграцию нам.
В целом, переход на Material Theme довольно прост и даёт преимущества. На него стоит перейти только ради стилей для стандартных виджетов, которые особенно круто выглядят на последних версиях Android.
Подробнее про эти преимущества можно почитать в этой статье.
Уменьшение времени старта приложения с I/O prefetching
#разработка #статьи
Сегодня состоялся релиз Android 11, и мне бы хотелось рассмотреть одну из фич, которая может неплохо улучшить время старта приложения — IORap.
Разработчики обещают уменьшение времени старта приложения, как минимум 5%, на большом числе устройств, хотя некоторые из наблюдаемых приложений показывали улучшения более, чем на 25%.
IORap работает как независимый сервис на устройстве и пытается предугадать, какие IO сервисы будут необходимы на устройстве. И если раньше они вызывались в тот момент, когда были нужны приложению, то теперь они будут браться из pagecache, улучшая время старта приложения.
Ребята подсчитали, что 80% популярных приложений из Google Play проводят больше 10% времени старта, блокируя I/O во время запуска, поэтому от этой фичи пользу получитат довольно многие приложения.
Подробнее о том, как работает OIRap можно почитать тут.
#разработка #статьи
Сегодня состоялся релиз Android 11, и мне бы хотелось рассмотреть одну из фич, которая может неплохо улучшить время старта приложения — IORap.
Разработчики обещают уменьшение времени старта приложения, как минимум 5%, на большом числе устройств, хотя некоторые из наблюдаемых приложений показывали улучшения более, чем на 25%.
IORap работает как независимый сервис на устройстве и пытается предугадать, какие IO сервисы будут необходимы на устройстве. И если раньше они вызывались в тот момент, когда были нужны приложению, то теперь они будут браться из pagecache, улучшая время старта приложения.
Ребята подсчитали, что 80% популярных приложений из Google Play проводят больше 10% времени старта, блокируя I/O во время запуска, поэтому от этой фичи пользу получитат довольно многие приложения.
Подробнее о том, как работает OIRap можно почитать тут.
Как использовать Jetpack DataStore?
#разработка #статьи #опрос
С появлением Jetpack у нас появилось довольно много библиотек, делающих жизнь разработчиков проще. Думаю, что для многих не секрет, что недавно Google представили ещё одну крутую библиотеку — DataStore, которая призвана заменить старый добрый
•
•
•
• есть API для миграции с
• работают на основе
В общем, это довольно мощная библиотека, которую вскоре будут использовать большинство приложений. 🤓
Ну а если ваше приложение может использовать alpha-версии библиотек, то у вас уже есть возможность попробовать эту библиотеку.
Хорошая статья с пошаговым руководством тут.
Как вам библиотека? На мой взгляд, получилось довольно круто.
#разработка #статьи #опрос
С появлением Jetpack у нас появилось довольно много библиотек, делающих жизнь разработчиков проще. Думаю, что для многих не секрет, что недавно Google представили ещё одну крутую библиотеку — DataStore, которая призвана заменить старый добрый
SharedPreferences, имеющий недостатки.•
DataStore предлагает асинхронный API для работы с данными, в то время как SharedPreferences даёт такую возможность только при помощи listeners;•
DataStore безопасно вызывать в UI-потоке, так как под капотом он использует Dispatchers.IO•
DataStore лучше работает с Runtime Exceptions, в то время как SharedPreferences могут вызывать ошибки при парсинге, которые сложнее поймать;• есть API для миграции с
SharedPreferences;• работают на основе
Coroutines и Flow из коробки.В общем, это довольно мощная библиотека, которую вскоре будут использовать большинство приложений. 🤓
Ну а если ваше приложение может использовать alpha-версии библиотек, то у вас уже есть возможность попробовать эту библиотеку.
Хорошая статья с пошаговым руководством тут.
Как вам библиотека? На мой взгляд, получилось довольно круто.
С днем программиста, друзья!
Время мчится, за окном осень и приходит наш профессиональный праздник 🤗.
Сегодня 256 день в году, 12 сентября, и уже несколько лет именно в этот день отмечается день программиста.
Желаю всем нам крутых проектов, интересных задач, профессионального и личностного роста. А завтрашний день лучше используйте, чтобы провести его в теплом круге друзей, а не сидя за IDE.👨💻
Хорошего вам Дня программиста и выходных!
Время мчится, за окном осень и приходит наш профессиональный праздник 🤗.
Сегодня 256 день в году, 12 сентября, и уже несколько лет именно в этот день отмечается день программиста.
Желаю всем нам крутых проектов, интересных задач, профессионального и личностного роста. А завтрашний день лучше используйте, чтобы провести его в теплом круге друзей, а не сидя за IDE.👨💻
Хорошего вам Дня программиста и выходных!
Лимит уведомлений от одного приложения
#разработка #статьи
Задумывались ли вы, есть ли ограничение на максимальное количество уведомлений от одного приложения? Если попытаться найти какие-то упоминания об этом в документации, то там не будет какой-то внятной информации об этом. Однако, такой лимит существует.
Автор статьи провёл исследование и пришёл к выводу, что количество уведомлений от одного приложения контролируется производителем смартфонов.
Например, у Google Pixel 3A максимальное количество уведомлений равно 25, а у OnePlus 6T или Samsung — 50.
Вы можете подумать: но ведь 25 уведомлений — это много, что уж говорить про 50. Но если ваше приложение завязано на уведомлениях (например мессенджер), то такое ограничение может привести к некорректной работе приложения, и тем более сервисов.
Так что рекомендую проверить своё приложение, если оно может выводить такое количество уведомлений пользователю.
#разработка #статьи
Задумывались ли вы, есть ли ограничение на максимальное количество уведомлений от одного приложения? Если попытаться найти какие-то упоминания об этом в документации, то там не будет какой-то внятной информации об этом. Однако, такой лимит существует.
Автор статьи провёл исследование и пришёл к выводу, что количество уведомлений от одного приложения контролируется производителем смартфонов.
Например, у Google Pixel 3A максимальное количество уведомлений равно 25, а у OnePlus 6T или Samsung — 50.
Вы можете подумать: но ведь 25 уведомлений — это много, что уж говорить про 50. Но если ваше приложение завязано на уведомлениях (например мессенджер), то такое ограничение может привести к некорректной работе приложения, и тем более сервисов.
Так что рекомендую проверить своё приложение, если оно может выводить такое количество уведомлений пользователю.
Не используйте LiveData в репозиториях
#разработка #статьи
Одной из частых ошибок при разработке приложений является использование LiveData в репозиториях. Связано это прежде всего с тем, что изначально Google советовали использовать её подобным образом.
Но если изучить подобный проект, то можно заметить большое количество блокировок главного потока, так как observer из LiveData всегда вызывается в нём. Поэтому, хорошей практикой будет использовать её именно на слое, который связан с отображением данных.
Альтернативой LiveData будет использование Flow, который имеет больше контроля над местом, где он исполняется. Подробнее об этом можно почитать тут.
#разработка #статьи
Одной из частых ошибок при разработке приложений является использование LiveData в репозиториях. Связано это прежде всего с тем, что изначально Google советовали использовать её подобным образом.
Но если изучить подобный проект, то можно заметить большое количество блокировок главного потока, так как observer из LiveData всегда вызывается в нём. Поэтому, хорошей практикой будет использовать её именно на слое, который связан с отображением данных.
Альтернативой LiveData будет использование Flow, который имеет больше контроля над местом, где он исполняется. Подробнее об этом можно почитать тут.
WorkManager. Базовая информация
#разработка #новичкам
За последние несколько лет в Android постоянно менялась работа с фоновыми операциями. Самая главная причина — это постоянно возрастающее количество приложений на устройстве пользователя, соответственно растущее число фоновых задач и повышенная разрядка батареи.
Поэтому, очень важно следить за тем, как исполняются фоновые операции на устройстве. Сейчас для исполнения фоновых операций существует WorkManager.
Если вы не так давно в мобильной разработке или хотите упорядочить свои знания по нему, то рекомендую две статьи.
Первая даёт базовые основы использования WorkManager: какие зависимости добавить, какие есть типы операций и параметры для них.
Вторая описывает работу с WorkManager чуть дальше и рассказывает о цепочках запросов, прогрессе, статусе операции и как завершить текущую работу.
#разработка #новичкам
За последние несколько лет в Android постоянно менялась работа с фоновыми операциями. Самая главная причина — это постоянно возрастающее количество приложений на устройстве пользователя, соответственно растущее число фоновых задач и повышенная разрядка батареи.
Поэтому, очень важно следить за тем, как исполняются фоновые операции на устройстве. Сейчас для исполнения фоновых операций существует WorkManager.
Если вы не так давно в мобильной разработке или хотите упорядочить свои знания по нему, то рекомендую две статьи.
Первая даёт базовые основы использования WorkManager: какие зависимости добавить, какие есть типы операций и параметры для них.
Вторая описывает работу с WorkManager чуть дальше и рассказывает о цепочках запросов, прогрессе, статусе операции и как завершить текущую работу.
Жизнь разработчика в Израиле
#интервью #экспаты
Друзья, первая статья из новой рубрики на канале готова.
Она получилась объёмной и рассматривает большинство вопросов жизни в Израиле и отвечает на те вопросы, которые вы задавали: как найти работу, какая там зарплата, насколько легко получить визу и гражданство, как хорошо развита медицина и быт в целом.
Была проделана огромная работа, и я надеюсь, что вам понравится статья.😎
Ссылка на статью тут, обязательно ставьте лайки (их можно поставить не один раз, а аж 50😁) !
Ещё приятный момент. Я долго размышлял, нужен ли каналу чат, и понял, что он не будет лишним, ведь в нём мы сможем обсуждать всё, что происходит на канале, в частности подобные статьи (их можно обсудить там же с героем).
Поэтому, если у вас останутся вопросы к Андрею (герою статьи), то вы можете задать их в @android_live_chat, а самыми интересными я дополню статью.😏
Давайте сделаем наш чатик уютным и интересным!
#интервью #экспаты
Друзья, первая статья из новой рубрики на канале готова.
Она получилась объёмной и рассматривает большинство вопросов жизни в Израиле и отвечает на те вопросы, которые вы задавали: как найти работу, какая там зарплата, насколько легко получить визу и гражданство, как хорошо развита медицина и быт в целом.
Была проделана огромная работа, и я надеюсь, что вам понравится статья.😎
Ссылка на статью тут, обязательно ставьте лайки (их можно поставить не один раз, а аж 50😁) !
Ещё приятный момент. Я долго размышлял, нужен ли каналу чат, и понял, что он не будет лишним, ведь в нём мы сможем обсуждать всё, что происходит на канале, в частности подобные статьи (их можно обсудить там же с героем).
Поэтому, если у вас останутся вопросы к Андрею (герою статьи), то вы можете задать их в @android_live_chat, а самыми интересными я дополню статью.😏
Давайте сделаем наш чатик уютным и интересным!
Medium
Жизнь разработчика в Израиле
Андрей — Lead Mobile Developer в компании Appcard и уже 5 лет живёт в Израиле, из которых 3 года вместе с семьей проживает в городе…
Paging3
#jetpack #чтонового
Совсем недавно появилась, так называемая, третья версия Paging-библиотеки, созданная для улучшения загрузки данных по частям и отображения их в списках.
Текущая версия — 3.0.0-alpha03.
Что нового?
🔸полностью написана на Kotlin;
🔸поддерживает Coroutines и Flow из коробки, как и RxJava с LiveData;
🔸кэширует данные в памяти, чтобы помочь в распределении системных ресурсов и загрузки данных без задержек;
🔸улучшенный адаптер для RecyclerView;
🔸встроенная поддержка обработок ошибок, повторных запросов и обновлений.
Подробнее
Ссылка на статью с примерами использования тут.
Пример codelab с Paging3 тут.
#jetpack #чтонового
Совсем недавно появилась, так называемая, третья версия Paging-библиотеки, созданная для улучшения загрузки данных по частям и отображения их в списках.
Текущая версия — 3.0.0-alpha03.
Что нового?
🔸полностью написана на Kotlin;
🔸поддерживает Coroutines и Flow из коробки, как и RxJava с LiveData;
🔸кэширует данные в памяти, чтобы помочь в распределении системных ресурсов и загрузки данных без задержек;
🔸улучшенный адаптер для RecyclerView;
🔸встроенная поддержка обработок ошибок, повторных запросов и обновлений.
Подробнее
Ссылка на статью с примерами использования тут.
Пример codelab с Paging3 тут.
Mobius 2020
#конференции
Думаю, что большинству разработчиков известна конференция Mobius. Напомню, что это крутая техническая конференция, целиком посвящённая мобильной разработке. Ну и доклады от экспертов, которые из первых рук делятся своими наработками со всеми.
В этом году конференция стала online и пройдёт с 11 по 14 ноября. Нас ждёт: 4 дня эфира, несколько треков, около 20 докладов, воркшопы и Q&A-сессии.
Для подписчиков канала ребята дают скидку на билеты из категории Personal в 1500 рублей: AndroidLive2020aupc.
Программа потихоньку заполняется, и сейчас самое время купить билеты по более низкой цене. Ссылка с информацией тут.
#конференции
Думаю, что большинству разработчиков известна конференция Mobius. Напомню, что это крутая техническая конференция, целиком посвящённая мобильной разработке. Ну и доклады от экспертов, которые из первых рук делятся своими наработками со всеми.
В этом году конференция стала online и пройдёт с 11 по 14 ноября. Нас ждёт: 4 дня эфира, несколько треков, около 20 докладов, воркшопы и Q&A-сессии.
Для подписчиков канала ребята дают скидку на билеты из категории Personal в 1500 рублей: AndroidLive2020aupc.
Программа потихоньку заполняется, и сейчас самое время купить билеты по более низкой цене. Ссылка с информацией тут.
Как оптимизировать RecyclerView?
#комментарии #recyclerview
Ни для кого не секрет, что сегодня
Автор статьи предлагает следующие оптимизации:
🔸использование библиотек для загрузки изображений. Garbage collector мог бы быть причиной неотвечающего UI, если бы не bitmap pool, который встроен в большинство современных библиотек для загрузки изображений. Думаю, что мало кто сегодня пытается самостоятельно управлять показом изображений вручную, поэтому продолжайте делегировать все задачи, связанные с загрузкой изображений специальным библиотекам.
🔸установите ширину и высоту для ImageView. Очень часто изображения, получаемые с сервера имеют динамические параметры ширины и высоты. Если мы показываем изображения без учёта этих параметров, то при полной загрузке можем получить «мигание» интерфейса. Чтобы этого избежать, попробуйте вычислить ширину и высоту или соотношение сторон заранее, до загрузки картинки.
🔸оптимизируйте метод onBindViewHolder. Проверьте метод
🔸используйте DiffUtil. При обновлении адаптера старайтесь использовать DiffUtil. Под капотом он использует методы для изменения элементов по позициям, а не полное обновление списка (
🔸избегайте вложенных view. Довольно базовое правило, нарушение которого становится ещё более критичным в RecyclerView. Добавлю, что тут важно следить за layout, которые использут веса для отрисовки.
🔸используйте setHasFixedSize. Если элементы вашего RecyclerView имеют одинаковые параметры ширины и высоты, то эта функция улучшит производительность списка.
🔸переиспользуйте RecyclerViewPool. Довольно хорошей оптимизацией является переиспользование
🔸поэкспериментируйте с setItemViewCacheSize. Из документации следует, что этот параметр устанавливает количество
А что вы бы ещё добавили к этому списку?
#комментарии #recyclerview
Ни для кого не секрет, что сегодня
RecyclerView — это базовый элемент для показа списков в приложениях. И очень важно, чтобы он работал максимально плавно. Автор статьи предлагает следующие оптимизации:
🔸использование библиотек для загрузки изображений. Garbage collector мог бы быть причиной неотвечающего UI, если бы не bitmap pool, который встроен в большинство современных библиотек для загрузки изображений. Думаю, что мало кто сегодня пытается самостоятельно управлять показом изображений вручную, поэтому продолжайте делегировать все задачи, связанные с загрузкой изображений специальным библиотекам.
🔸установите ширину и высоту для ImageView. Очень часто изображения, получаемые с сервера имеют динамические параметры ширины и высоты. Если мы показываем изображения без учёта этих параметров, то при полной загрузке можем получить «мигание» интерфейса. Чтобы этого избежать, попробуйте вычислить ширину и высоту или соотношение сторон заранее, до загрузки картинки.
🔸оптимизируйте метод onBindViewHolder. Проверьте метод
onBindViewHolder и сделайте его максимально легким. Это также даст прирост к производительности RecyclerView🔸используйте DiffUtil. При обновлении адаптера старайтесь использовать DiffUtil. Под капотом он использует методы для изменения элементов по позициям, а не полное обновление списка (
notifyDataSetChanged). Кстати, если хотите ещё больше оптимизировать свой список, попробуйте использовать асинхронный DiffUtil на coroutines. Ссылка с деталями тут.🔸избегайте вложенных view. Довольно базовое правило, нарушение которого становится ещё более критичным в RecyclerView. Добавлю, что тут важно следить за layout, которые использут веса для отрисовки.
🔸используйте setHasFixedSize. Если элементы вашего RecyclerView имеют одинаковые параметры ширины и высоты, то эта функция улучшит производительность списка.
🔸переиспользуйте RecyclerViewPool. Довольно хорошей оптимизацией является переиспользование
RecyclerViewPool при наличии одинаковых элементов. Пример можно посмотреть в статье.🔸поэкспериментируйте с setItemViewCacheSize. Из документации следует, что этот параметр устанавливает количество
ViewHolder, которые не показаны на экране перед добавлением их в RecyclerViewPool. Мы можем поэкспериментировать с этим параметром, чтобы увеличить количество ViewHolder, невидимых на экране и уменьшить количество вызовов onBindViewHolder.А что вы бы ещё добавили к этому списку?
Podlodka Android Crew — 2 сезон
#конференции
Летом ребята из Podlodka делали двухнедельную онлайн конференцию для Android-разработчиков. И вот, уже через неделю начинается второй сезон Podlodka Android Crew!
Что нас ждёт:
🌟 парное программирование от Дениса Неклюдова и Степана Гончарова;
💰доклад о том, как из мобильного разработчика вырасти в СТО;
🔥собеседование наоборот: теперь будут собеседовать не людей с конференции, а экспертов, которые там присутствуют;
☕️куча сессий и, конечно же, холиваров.
Начало конференции — 5 октября. До четверга, цена билета — 3400 рублей, что весьма демократично, учитывая количество контента. Подробнее о программе и билетах тут.
И снова, у вас, подписчиков Android Live, есть шанс выиграть билет бесплатно. Для этого не нужно никуда подписываться: просто оставь свой ник в форме до 1 октября 18:00. В этот же день будет розыгрыш одного билета.
До встречи на конференции!
#конференции
Летом ребята из Podlodka делали двухнедельную онлайн конференцию для Android-разработчиков. И вот, уже через неделю начинается второй сезон Podlodka Android Crew!
Что нас ждёт:
🌟 парное программирование от Дениса Неклюдова и Степана Гончарова;
💰доклад о том, как из мобильного разработчика вырасти в СТО;
🔥собеседование наоборот: теперь будут собеседовать не людей с конференции, а экспертов, которые там присутствуют;
☕️куча сессий и, конечно же, холиваров.
Начало конференции — 5 октября. До четверга, цена билета — 3400 рублей, что весьма демократично, учитывая количество контента. Подробнее о программе и билетах тут.
И снова, у вас, подписчиков Android Live, есть шанс выиграть билет бесплатно. Для этого не нужно никуда подписываться: просто оставь свой ник в форме до 1 октября 18:00. В этот же день будет розыгрыш одного билета.
До встречи на конференции!
Room и связь Many to Many
#room
На мой взгляд, одна из самых неудобных вещей, которая есть в Room — это работа со связью Many to Many.
Для тех, кто не использовал эту связь в Room, я расскажу вкратце. Больше деталей можно почитать тут.
Для её создания в Room есть следующий механизм:
🔸создаётся ассоциативная таблица с идентификаторами первой и второй таблицы;
🔸создаётся новый data-класс, где прописывается связь через
По идее, все довольно просто, но главная сложность возникает в фильтрации данных. В документации показан пример с получением полного списка данных, но если её нужно сделать, то единственный вариант — использование
Для такой связи нужно будет создать
Главный недостаток тут — отсутствие проверки правильности запроса во время компиляции, поэтому будьте особенно внимательны при его составлении.
#room
На мой взгляд, одна из самых неудобных вещей, которая есть в Room — это работа со связью Many to Many.
Для тех, кто не использовал эту связь в Room, я расскажу вкратце. Больше деталей можно почитать тут.
Для её создания в Room есть следующий механизм:
🔸создаётся ассоциативная таблица с идентификаторами первой и второй таблицы;
🔸создаётся новый data-класс, где прописывается связь через
Junction, указывая эту таблицу в качестве связи.По идее, все довольно просто, но главная сложность возникает в фильтрации данных. В документации показан пример с получением полного списка данных, но если её нужно сделать, то единственный вариант — использование
@RawQuery вместо @Query и генерирования запроса вручную. Для такой связи нужно будет создать
INNER JOIN по ассоциативной таблице, и дальше применить нужные фильтры.Главный недостаток тут — отсутствие проверки правильности запроса во время компиляции, поэтому будьте особенно внимательны при его составлении.