Есть две основные причины ANR: это инициализация либ от Гугла и Фейсбука, которые в своих контент провайдерах парсят json-ки своих настроек. И как с этим бороться?
Модуль предоставляет реализацию каких-то действий или реакцию на какие-то события. Таким образом, если создать абстракции Action, Request и Event, и общение между модулями будет происходить только посредством их, то статическая линковка или DI уже не нужны. Достаточно модулю зарегистрировать, что он умеет обрабатывать эти самые Action-ы, Request-ы и Event-ы.
Также можно использовать динамически подключаемые Validator-ы, которые дополнительно могут проверять возможность обработки Action-ов, Request-ов и Event-ов.
Похожим функционалом, но несколько ограниченно, обладают LocalBroadcastManager, EventBus, RxJava.
Такая концепция модулей очень сильно помогает, когда в проекте бизнес-логика очень часто меняется и необходимо постоянно эти модули включать\выключать\заменять.
Но есть и свои минусы…
Идеальный модуль должен быть легко отключаемым, например, комментированием его в build.gradle. Если это условие не выполняется, то это уже не модуль, а часть монолита.
Applicatioin.onCreate() не предназначен для того, чтобы в нём инициализировать 100500 модулей и компонентов. Модуль может и сам себя проинициализировать через собственный контент-провайдер.
Например, в словах «грунт» и «горох», буква «г» произносится по разному, но пишется одинаково. Почему бы не добавить диакритику для ясности как произносить?
Более актуальна другая задача: часть шейпов сделать так, чтобы Tint на них не влиял.
Или сделать такой TintMode, который подменяет только один выбранный цвет, а не все.
Зачем для GradientDrawable свойство Tint? Какой может быть сценарий использования?
Если бы можно было с помощью Tint менять не все видимые пиксели, а только выбранных цветов, то это была бы совсем другая история.
В таблетках из аптеки — 100-150мг. Этого мне вполне достаточно для хорошего сна. На больших дозах может возникнуть резистентность к препарату. Да и принимаю не каждый день, а только по необходимости.
Мне хорошему сну чаще всего мешает:
— избыток эмоций, который вызывают ютубчики, новостные ленты и т.п.
— еда перед сном
— избыток навязчивых мыслей в голове, в основном по работе
Решение проблемы: обычный глицин из аптеки, работает отлично и вроде как без побочек.
Нагреватели для аквариума обычно уже идут с автоматической регуляцией температуры. Выставляется 26 градусов и забывается. Рыбкам не очень нравится изменение температуры.
А вот вебкамеру прикрутить было бы кстати. И счетчик живых рыбок. :)
З.Ы. Ил любят кушать улитки.
Нюанс у меня ещё в том, что проекты для Андроид, где нет VM оптимизаций для String.equals().
Классы для дедупликаций упираются в то же самое посимвольное сравнение.
У меня в проектах больше всего проблем создаёт String.equals(), который посимвольно проверяет равенство двух строк. Это очень сильно сказывается на поиске в разных Map-ах.
Если надо напрямую сравнить, то быстрее всего работает вариант:
Или сравнивать только по хеш-коду, если строгое равенство контента не особо критичено, особенно на длинных строках.
А при вставке в Map-ы и при поиске в них, в качестве ключа, желательно строки интернировать, чтобы избежать посимвольного сравнения. Но некоторые разработчики высказываются категорически против интернирования вообще, по причине мифической утечки памяти.
Но через контент-провайдеры работать намного удобнее и проще.
Также можно использовать динамически подключаемые Validator-ы, которые дополнительно могут проверять возможность обработки Action-ов, Request-ов и Event-ов.
Похожим функционалом, но несколько ограниченно, обладают LocalBroadcastManager, EventBus, RxJava.
Такая концепция модулей очень сильно помогает, когда в проекте бизнес-логика очень часто меняется и необходимо постоянно эти модули включать\выключать\заменять.
Но есть и свои минусы…
Applicatioin.onCreate() не предназначен для того, чтобы в нём инициализировать 100500 модулей и компонентов. Модуль может и сам себя проинициализировать через собственный контент-провайдер.
Просто это Диакритика
Или сделать такой TintMode, который подменяет только один выбранный цвет, а не все.
Если бы можно было с помощью Tint менять не все видимые пиксели, а только выбранных цветов, то это была бы совсем другая история.
Очень много программистов сидят на этом препарате и он есть в составе многих «стимуляторов».
— избыток эмоций, который вызывают ютубчики, новостные ленты и т.п.
— еда перед сном
— избыток навязчивых мыслей в голове, в основном по работе
Решение проблемы: обычный глицин из аптеки, работает отлично и вроде как без побочек.
А вот вебкамеру прикрутить было бы кстати. И счетчик живых рыбок. :)
З.Ы. Ил любят кушать улитки.
Классы для дедупликаций упираются в то же самое посимвольное сравнение.
Если надо напрямую сравнить, то быстрее всего работает вариант:
Или сравнивать только по хеш-коду, если строгое равенство контента не особо критичено, особенно на длинных строках.
А при вставке в Map-ы и при поиске в них, в качестве ключа, желательно строки интернировать, чтобы избежать посимвольного сравнения. Но некоторые разработчики высказываются категорически против интернирования вообще, по причине мифической утечки памяти.