Мобильное Чтиво
Очень серьезный канал про мобильную разработку. Веду канал я — @maxkachinkin
إظهار المزيد- المشتركون
- التغطية البريدية
- ER - نسبة المشاركة
جاري تحميل البيانات...
جاري تحميل البيانات...
С достаточным количеством пользователей API, неважно, что вы обещали в контракте: все наблюдаемые поведения вашей системы будут зависеть от кого-то.По мере роста популярности SDK, пользователи начинают полагаться на все аспекты его работы, даже на те, которые вы не документировали. Это создает "неявный интерфейс", и любые изменения могут вызвать хаос. И здесь я бы перешел из мира SDK в мир многомодульной архитектуры приложений. Ведь у нас с вами тут тоже самое, только в меньших масштабах. Если разработчикам SDK приходится супер тщательно продумывать API, нам тоже не помешает этому уделять внимание. Потому что если вы сделали общий модуль и многие команды его используют, то если у нас не достаточно подробно описана документация, ожидайте появление “неявного интерфейса”! 🔥 Как с этим бороться? Я предлагаю 2 банальных, но важных пункта: 1. 📄Всегда пишите документацию в таких случаях 2. 🧪Покрывайте тестами ваше API, в поисках неявных интерфесов Сталкивались ли вы с тем, что вашим API пользуются не так, как вы задумывали? #wisdom #api #sdk
Application::onCreate
. Но важно понимать, что если у вас несколько Initializer’ов, они могут начать зависеть друг от друга. Например, вам надо, чтобы система логирования была проинициализирована до блока с миграцией базы данных.
🚀 Как решить проблему?
Переопределите метод dependencies()
, чтобы указать, от каких Initializer’ов зависит текущий. Это задаст порядок и поможет избежать проблем. Однако иногда проще создать главный корневой Initializer, который запустит все остальные, чтобы избежать сложного дерева зависимостей, как показано на картинке.
Здесь важно отметить, что все Initializer’ы будут работать в главном потоке и строго по порядку, указанному в dependencies. Но есть одна тонкость — если Initializer запускает асинхронный код.
Представьте, что CInitializer
зависит от AInitializer
, но AInitializer
запускает асинхронную корутину (например, поход в файловую систему). Она может выполниться к моменту работы CInitializer
, а может и нет. Это создает риск возникновения race condition.
Мораль: Помните, что все зависимые Initializer’ы работают строго по порядку. Но если запускаете что-то асинхронное, будьте внимательны и проверяйте, чтобы это не создало проблем.
А вы используете Initializer в своих проектах? Делитесь опытом!
#appstart #initializer #androidБлижайшая конференция — Mobius 2024 Autumn, 11 октября (Online), 19–20 октября, Санкт-Петербург. Подробности и билеты:
https://jrg.su/Yu6KNJ— — Скачать презентацию с сайта Mobius —
https://jrg.su/Hn17D4Вас влечет мир Jetpack Compose или вы уже на пороге перехода с View на этот фреймворк? Может, вы уже в процессе миграции или просто исследуете новые горизонты Android? Если да, то доклад Максима о переходе проекта с View на Compose сможет вас заинтересовать. Спикер поделился тремя ключевыми кейсами-вызовами, с которыми столкнулись в процессе перехода: — Работа с вложенными скроллами и свайпами. — Использование Compose в RecyclerView. — И наиболее значимая задача — решение проблемы медленного первого запуска, вызванной особенностью Compose как unbundled library. Он рассказал о методах борьбы с этими сложностями (и да, в некоторых ситуациях команда предпочла остаться с View), какие метрики использовали для оценки и каких улучшений удалось достигнуть в итоге. Этот доклад не критика Compose. Напротив, его предназначение — поделиться с вами знаниями о потенциальных подводных камнях. Задача спикера — помочь вам сэкономить время и ресурсы, когда вы решите перевести ваш проект на Compose. Скучно не будет! #compose #jetpackcompose
تسمح خطتك الحالية بتحليلات لما لا يزيد عن 5 قنوات. للحصول على المزيد، يُرجى اختيار خطة مختلفة.