Как загрузить и кэшировать изображение без использования библиотек?
Именно такая задача была задана автору статьи в качестве теста при приёме на работу. Пример решения:
— добавить android.permission.INTERNET в manifest файл и зависимости корутин в проект,
— создать CachingUtil с функциями:
1. getBitmapFromURL, которая загружает изображение с URL-адреса.
2. storeBitmap — эта функция будет кэшировать изображение в виде файла и сохранять его во внутреннем хранилище.
3. loadBitmap — для получения изображения из хранилища.
— реализовать Main Activity, в котором проверяется, существует или нет кэшированное изображение для отображения.
Источник: https://tprg.ru/WsTi
Репозиторий: https://github.com/osamaalek/load-and-caching-image
Как бы вы решили эту задачу?
#android
Именно такая задача была задана автору статьи в качестве теста при приёме на работу. Пример решения:
— добавить android.permission.INTERNET в manifest файл и зависимости корутин в проект,
— создать CachingUtil с функциями:
1. getBitmapFromURL, которая загружает изображение с URL-адреса.
2. storeBitmap — эта функция будет кэшировать изображение в виде файла и сохранять его во внутреннем хранилище.
3. loadBitmap — для получения изображения из хранилища.
— реализовать Main Activity, в котором проверяется, существует или нет кэшированное изображение для отображения.
Источник: https://tprg.ru/WsTi
Репозиторий: https://github.com/osamaalek/load-and-caching-image
Как бы вы решили эту задачу?
#android
👍14💩4🤔2
This media is not supported in your browser
VIEW IN TELEGRAM
SwiftUI Spring — примеры анимаций в SwiftUI
В этом репозитории собраны интересные варианты анимаций Spring, а также примеры их реализации:
https://github.com/GetStream/swiftui-spring-animations
#ios #swiftui
В этом репозитории собраны интересные варианты анимаций Spring, а также примеры их реализации:
https://github.com/GetStream/swiftui-spring-animations
#ios #swiftui
👍7🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Как реализовать всплывающие окна на Flutter карте
Во Flutter есть плагин flutter_map_marker_popup, который позволяет добавлять всплывающие окна на маркеры положения на карте. Также в плагине есть методы для отображения/скрытия всплывающих окон. Marker_popup работает с Flutter_map, поэтому для работы с Яндекс.Карты или Google Maps он не подойдет.
В этой статье рассматривается, как добавить Flutter_map в проект, настроить маркеры и отслеживать нажатие по ним:
https://habr.com/ru/post/689578/
#flutter
Во Flutter есть плагин flutter_map_marker_popup, который позволяет добавлять всплывающие окна на маркеры положения на карте. Также в плагине есть методы для отображения/скрытия всплывающих окон. Marker_popup работает с Flutter_map, поэтому для работы с Яндекс.Карты или Google Maps он не подойдет.
В этой статье рассматривается, как добавить Flutter_map в проект, настроить маркеры и отслеживать нажатие по ним:
https://habr.com/ru/post/689578/
#flutter
👍6❤🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Какие изменения коснулись системного Back в Android 13?
Начиная с Android 13, метод onBackPressed() считается устаревшим. Одной из главных причин таких изменений стал новый подход «predictive back gesture».
По сути, это жест назад, который показывает превью — куда переходит пользователь перед самим переходом обратно. С учётом нововведений в OnBackPressedDispatcher появился вызов OnBackInvokedCallback.
В этой статье рассматривается, как заменить устаревшую функцию onBackPressed() на OnBackPressedCallback:
https://tprg.ru/4A8N
#android
Начиная с Android 13, метод onBackPressed() считается устаревшим. Одной из главных причин таких изменений стал новый подход «predictive back gesture».
По сути, это жест назад, который показывает превью — куда переходит пользователь перед самим переходом обратно. С учётом нововведений в OnBackPressedDispatcher появился вызов OnBackInvokedCallback.
В этой статье рассматривается, как заменить устаревшую функцию onBackPressed() на OnBackPressedCallback:
https://tprg.ru/4A8N
#android
👍16🤔1💩1
Можно ли автоматизировать процесс обнаружения регрессии размера Android-приложений?
По данным Google, пользователи все ещё избегают загрузки больших приложений, особенно в странах, где действуют тарифы с оплатой за каждый байт. Также компания советует уменьшить размер приложения, если это возможно. Однако как отслеживать процесс оптимизации?
В этой серии статей рассматривается, как проверить регрессию размера приложения на CI в development ветке, в pull request и максимально автоматизировать этот процесс:
Часть 1: https://tprg.ru/B1vh
Часть 2: https://tprg.ru/pSTk
#android
По данным Google, пользователи все ещё избегают загрузки больших приложений, особенно в странах, где действуют тарифы с оплатой за каждый байт. Также компания советует уменьшить размер приложения, если это возможно. Однако как отслеживать процесс оптимизации?
В этой серии статей рассматривается, как проверить регрессию размера приложения на CI в development ветке, в pull request и максимально автоматизировать этот процесс:
Часть 1: https://tprg.ru/B1vh
Часть 2: https://tprg.ru/pSTk
#android
👍5💩1
This media is not supported in your browser
VIEW IN TELEGRAM
Проблемы многопоточности: обнаружение deadlocks
Самый просто пример взаимоблокировки в Swift — вызов метода sync на главном потоке. В таких случаях приложение перестаёт отвечать на запросы и, как может показаться, самым простым решением является перезапуск приложения.
Такие функции, как actors, могут снизить количество дедлоков, но не решают проблему до конца. В этой статье рассматриваются основные причины взаимоблокировок, способы их обнаружения в Xcode, а также методы решения этой проблемы:
https://www.avanderlee.com/swift/deadlocks-detecting-solving/
#ios
Самый просто пример взаимоблокировки в Swift — вызов метода sync на главном потоке. В таких случаях приложение перестаёт отвечать на запросы и, как может показаться, самым простым решением является перезапуск приложения.
Такие функции, как actors, могут снизить количество дедлоков, но не решают проблему до конца. В этой статье рассматриваются основные причины взаимоблокировок, способы их обнаружения в Xcode, а также методы решения этой проблемы:
https://www.avanderlee.com/swift/deadlocks-detecting-solving/
#ios
👍6
Бойлерплейт для построения СI/CD pipeline для Android-приложений
Можно ли как-то автомизировать процессы проверки и доставки приложения в тестовую и производственную среду? Один из вариантов — это использовать бойлер для быстрой настройки CI/CD пайплайна.
Команда разработчиков из Mad Devs рассказала про преимуществах работы бойлера на Fastlane, а также о том, как настроить окружения под него:
https://tproger.ru/articles/bojlerplejt-na-fastlane-dlja-integracii-obnovlenij-ci-cd-android-prilozhenij/
#android
Можно ли как-то автомизировать процессы проверки и доставки приложения в тестовую и производственную среду? Один из вариантов — это использовать бойлер для быстрой настройки CI/CD пайплайна.
Команда разработчиков из Mad Devs рассказала про преимуществах работы бойлера на Fastlane, а также о том, как настроить окружения под него:
https://tproger.ru/articles/bojlerplejt-na-fastlane-dlja-integracii-obnovlenij-ci-cd-android-prilozhenij/
#android
👍4
Подборка актуальных вакансий
— Старший Android-разработчик
Где: Москва
Опыт: от 3 лет
— Senior Android-разработчик
Где: Москва, можно удалённо
Опыт: от 3 лет
— iOS-разработчик
Где: удалённо
Опыт: можно без опыта
— iOS-разработчик
Где: Москва
Опыт: можно без опыта
— iOS-разработчик
Где: Москва, Санкт-Петербург, Казань, Пермь, можно удалённо
Опыт: от 2 лет
— Middle iOS-разработчик
Где: Москва
Опыт: от 3 лет
— Senior iOS-разработчик
Где: Москва
Опыт: от 3 лет
#вакансии #работа
— Старший Android-разработчик
Где: Москва
Опыт: от 3 лет
— Senior Android-разработчик
Где: Москва, можно удалённо
Опыт: от 3 лет
— iOS-разработчик
Где: удалённо
Опыт: можно без опыта
— iOS-разработчик
Где: Москва
Опыт: можно без опыта
— iOS-разработчик
Где: Москва, Санкт-Петербург, Казань, Пермь, можно удалённо
Опыт: от 2 лет
— Middle iOS-разработчик
Где: Москва
Опыт: от 3 лет
— Senior iOS-разработчик
Где: Москва
Опыт: от 3 лет
#вакансии #работа
🤮7
Создаём приложение для брони в кинотеатрах на SwiftUI
В этом видеоуроке рассматривается, как реализовать приложение для iOS на основе дизайна в Figma. В приложение можно выбирать не только фильмы и время сеанса, но и места в кинотеатре. Автор показывает примеры, как создать drag-жест, карточки в стиле Tinder со swipe.
Подробнее: https://youtu.be/EkcKeGQm3_U
#ios
В этом видеоуроке рассматривается, как реализовать приложение для iOS на основе дизайна в Figma. В приложение можно выбирать не только фильмы и время сеанса, но и места в кинотеатре. Автор показывает примеры, как создать drag-жест, карточки в стиле Tinder со swipe.
Подробнее: https://youtu.be/EkcKeGQm3_U
#ios
👍4
История миграции AOSP QuickSearchBox приложения на Kotlin
В общей сложности для рефакторинга приложения из AOSP с Java на Kotlin у стажёра заняло 6 недель. В статье разбираются баги, с которыми пришлось столкнуться при автоматической конвертации.
Также, чтобы проанализировать изменения, разработчики провели несколько контрольных тестов и сравнили показатели производительности, подробнее:
https://tprg.ru/rE1t
#android #kotlin
В общей сложности для рефакторинга приложения из AOSP с Java на Kotlin у стажёра заняло 6 недель. В статье разбираются баги, с которыми пришлось столкнуться при автоматической конвертации.
Также, чтобы проанализировать изменения, разработчики провели несколько контрольных тестов и сравнили показатели производительности, подробнее:
https://tprg.ru/rE1t
#android #kotlin
👍3❤🔥1
Релиз Kotlin 1.7.20: что нового?
— Компилятор Kotlin K2 теперь поддерживает all-open, no-arg, Lombok и несколько других плагинов.
— Новый оператор «..<» для создания открытых диапазонов (open-ended ranges).
— Поддержка Gradle 7.1.
— Модель памяти Kotlin/Native теперь работаeт по умолчанию.
— Новая экспериментальная функция для JVM: Generic Inline Class.
Источник: https://blog.jetbrains.com/kotlin/2022/09/kotlin-1-7-20-released/
Документация: https://kotlinlang.org/docs/whatsnew1720.html
#kotlin
— Компилятор Kotlin K2 теперь поддерживает all-open, no-arg, Lombok и несколько других плагинов.
— Новый оператор «..<» для создания открытых диапазонов (open-ended ranges).
— Поддержка Gradle 7.1.
— Модель памяти Kotlin/Native теперь работаeт по умолчанию.
— Новая экспериментальная функция для JVM: Generic Inline Class.
Источник: https://blog.jetbrains.com/kotlin/2022/09/kotlin-1-7-20-released/
Документация: https://kotlinlang.org/docs/whatsnew1720.html
#kotlin
👍12💩3🤔1
Анти-паттерны: как правильно обрабатывать исключения в Dart
В статье рассмотрены распространенные ошибки, которые можно допустить при обработке исключений, а также способы, как сделать это правильно.
Большинство багов связаны с потерей стека вызовов, из-за чего логи в журналах (например, в Crashlytics или Sentry) практически не дают полезной информации, и проблему отследить ещё сложнее:
https://plugfox.dev/error-handling-and-anti-patterns/
#flutter #dart
В статье рассмотрены распространенные ошибки, которые можно допустить при обработке исключений, а также способы, как сделать это правильно.
Большинство багов связаны с потерей стека вызовов, из-за чего логи в журналах (например, в Crashlytics или Sentry) практически не дают полезной информации, и проблему отследить ещё сложнее:
https://plugfox.dev/error-handling-and-anti-patterns/
#flutter #dart
🔥7
Звёздным разрабам — звёздные продукты
МТС ищет опытных IT-специалистов по самым разным направлениям: от разработки и архитектуры до продуктовой аналитики и тестирования.
Сегодня МТС - это технологичная экосистема, в которой создают и развивают сервисы в финтехе, медиа,
стриминге, облаках, IoT, AI, Big Data и не только.
Узнайте подробнее о вакансиях, приходите возглавить процесс разработки цифровых продуктов и строить новый МТС.
#работа #вакансии
МТС ищет опытных IT-специалистов по самым разным направлениям: от разработки и архитектуры до продуктовой аналитики и тестирования.
Сегодня МТС - это технологичная экосистема, в которой создают и развивают сервисы в финтехе, медиа,
стриминге, облаках, IoT, AI, Big Data и не только.
Узнайте подробнее о вакансиях, приходите возглавить процесс разработки цифровых продуктов и строить новый МТС.
#работа #вакансии
💩18👎2❤🔥1👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Как заменить стандартное окно сбоя своим пользовательским экраном ошибки?
Идея проста: нужно создать Crash Activity и App Class. Crash Activity будет запускаться каждый раз, когда в приложении происходит сбой.
В этой статье рассматривается, как реализовать GlobalExceptionHandler со всеми методами для перехвата исключений и ошибок, Crash Activity, а также шаблон простого дизайна для окна:
https://tprg.ru/012a
#android
Идея проста: нужно создать Crash Activity и App Class. Crash Activity будет запускаться каждый раз, когда в приложении происходит сбой.
В этой статье рассматривается, как реализовать GlobalExceptionHandler со всеми методами для перехвата исключений и ошибок, Crash Activity, а также шаблон простого дизайна для окна:
https://tprg.ru/012a
#android
👍26🤔1
YouTube плеер для Android и Chromecast
Аndroid-youtube-player — это библиотека, которая позволяет легко встроить YouTube плеер в приложение. Библиотека работает под IFrame Player API (официальный API от YouTube).
Таким образом, приложение YouTube не требуется на устройстве пользователя, и нет никаких нарушений со стороны разработчика в Terms of Service.
Репозиторий: https://github.com/PierfrancescoSoffritti/android-youtube-player
(GitHub 2.8 тыс. звёзд)
#android
Аndroid-youtube-player — это библиотека, которая позволяет легко встроить YouTube плеер в приложение. Библиотека работает под IFrame Player API (официальный API от YouTube).
Таким образом, приложение YouTube не требуется на устройстве пользователя, и нет никаких нарушений со стороны разработчика в Terms of Service.
Репозиторий: https://github.com/PierfrancescoSoffritti/android-youtube-player
(GitHub 2.8 тыс. звёзд)
#android
👍20❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Создание игры Тетрис на SwiftUI
Тетрис базируется на сетке в 128 ячеек (8х16). Однако основная проблема при реализации игры была в выравнивание фигур при их движении. Автор упростил задачу, пронумеровав квадраты — цифры отображают их размещение в блоках массива.
Подробное руководство по реализации игры и анимаций — в статье:
https://tprg.ru/R8wg
#swiftui
Тетрис базируется на сетке в 128 ячеек (8х16). Однако основная проблема при реализации игры была в выравнивание фигур при их движении. Автор упростил задачу, пронумеровав квадраты — цифры отображают их размещение в блоках массива.
Подробное руководство по реализации игры и анимаций — в статье:
https://tprg.ru/R8wg
#swiftui
👍11👎1🔥1
Compose Camp: Google открывает собственный лагерь!
Google начала организовывать специальный лагерь для тех, кто хочет изучить Jetpack Compose.
Кроме обучения на курсе, у участников есть возможность познакомиться с другими разработчиками в сообществе. Некоторые могут даже стать вожатым отряда.
На данные момент компания только развивает проект, поэтому встреч не так много, но есть ещё онлайн-сессии.
Подробнее:
https://developer.android.com/compose-camp
#android
Google начала организовывать специальный лагерь для тех, кто хочет изучить Jetpack Compose.
Кроме обучения на курсе, у участников есть возможность познакомиться с другими разработчиками в сообществе. Некоторые могут даже стать вожатым отряда.
На данные момент компания только развивает проект, поэтому встреч не так много, но есть ещё онлайн-сессии.
Подробнее:
https://developer.android.com/compose-camp
#android
👍6😁4
Flutter: настройка тем приложения
Чтобы настроить тему быстро и без лишнего кода, можно воспользоваться Theme Extensions. В файле theme.dart собраны зависимости, которые помогают создавать дополнения к текстовой теме и цветам приложения. Если в приложении нужна тёмная тема, то её можно быстро создать с помощью dark_theme.dart.
В этой статье подробно рассматриваются Theme Extensions и примеры создания различных тем:
https://habr.com/ru/post/690572/
#flutter
Чтобы настроить тему быстро и без лишнего кода, можно воспользоваться Theme Extensions. В файле theme.dart собраны зависимости, которые помогают создавать дополнения к текстовой теме и цветам приложения. Если в приложении нужна тёмная тема, то её можно быстро создать с помощью dark_theme.dart.
В этой статье подробно рассматриваются Theme Extensions и примеры создания различных тем:
https://habr.com/ru/post/690572/
#flutter
👍9
Почему исключения в Kotlin Coroutines это сложно и как с этим жить?
Обычная обработка ошибок на чистом Kotlin, например с блоком try-catch, работает не так очевидно в корутинах. Именно с этой проблемой столкнулся автор при изучении корутин.
В этой статье рассматривается:
— обработка ошибок с помощью CoroutineExceptionHandlers и try-catch,
— особенности обработки исключений в coroutineScope{},
—разница в обработке исключений между корутинами запущенными через launch и async.
Подробнее: https://habr.com/ru/post/689256/
#kotlin
Обычная обработка ошибок на чистом Kotlin, например с блоком try-catch, работает не так очевидно в корутинах. Именно с этой проблемой столкнулся автор при изучении корутин.
В этой статье рассматривается:
— обработка ошибок с помощью CoroutineExceptionHandlers и try-catch,
— особенности обработки исключений в coroutineScope{},
—разница в обработке исключений между корутинами запущенными через launch и async.
Подробнее: https://habr.com/ru/post/689256/
#kotlin
👍11
Как создавать визуальные эффекты на Flutter?
Присоединяйтесь к открытому уроку 6 октября в 20:00 по МСК с Дмитрием Золотовым, Flutter-разработчиком Яндекса.
На занятии вы рассмотрите возможности FragmentProgram и языка представления SPIR-V с дополнениями от Flutter 3.3, а также создадите виджеты с визуальными эффектами, например, горящего огня и бегущих волн.
Не упустите возможность предварительно попробовать онлайн-курс «Flutter Mobile Developer» от OTUS для тех, у кого есть опыт в программировании.
Для регистрации пройдите вступительный тест.
Информация о рекламодателе на сайте www.otus.ru
Присоединяйтесь к открытому уроку 6 октября в 20:00 по МСК с Дмитрием Золотовым, Flutter-разработчиком Яндекса.
На занятии вы рассмотрите возможности FragmentProgram и языка представления SPIR-V с дополнениями от Flutter 3.3, а также создадите виджеты с визуальными эффектами, например, горящего огня и бегущих волн.
Не упустите возможность предварительно попробовать онлайн-курс «Flutter Mobile Developer» от OTUS для тех, у кого есть опыт в программировании.
Для регистрации пройдите вступительный тест.
Информация о рекламодателе на сайте www.otus.ru
👍4
Оптимизация производительности приложения на Android
Весной 2020 года компания Lyft начала работу по улучшению производительности мобильных приложений. Изначально разработчики сосредоточились на одном показателе — Time To Interactive (TTI). Однако успех проекта стал стимулом для дальнейших исследований.
В статье разработчики Lyft делятся опытом, как им удалось оптимизировать скорость работы приложения и добиться стабильности благодаря отслеживанию и анализу сбоев в приложении:
https://eng.lyft.com/prioritizing-app-stability-cb7b4cf65d50
#android
Весной 2020 года компания Lyft начала работу по улучшению производительности мобильных приложений. Изначально разработчики сосредоточились на одном показателе — Time To Interactive (TTI). Однако успех проекта стал стимулом для дальнейших исследований.
В статье разработчики Lyft делятся опытом, как им удалось оптимизировать скорость работы приложения и добиться стабильности благодаря отслеживанию и анализу сбоев в приложении:
https://eng.lyft.com/prioritizing-app-stability-cb7b4cf65d50
#android
👍8