Какие проблемы могут возникнуть при частом вызове публичного метода
Что проверяют
Умеете ли вы искать реальную причину тормозов, а не винить сам факт вызова. Вызов метода в ART почти ничего не стоит, дорого то, что метод делает и из какого потока его зовут. Следом обычно спрашивают, чем вы это измерите.
Как отвечать
Сразу скажите, что старый совет из документации Android избегать геттеров внутри класса устарел: ART и R8 встраивают такие вызовы. Дальше проблемы по существу:
- главный поток: на кадр при 60 Гц около 16 мс, при 120 Гц около 8. Диск, сеть или тяжёлый парсинг в
onBindViewHolder,onDrawили обработчике скролла дают пропуски кадров, а блокировка ввода на 5 секунд приводит к ANR; - аллокации в горячих местах: объекты, созданные в
onDrawили на каждый элемент списка, провоцируют сборку мусора и подёргивания.Paint,Rect, форматтеры создают один раз; - лишняя работа UI: частые
notifyDataSetChanged()илиrequestLayout()перерисовывают больше нужного. Для списков естьListAdapterсDiffUtil; - Compose: тяжёлая функция в теле composable выполняется при каждой рекомпозиции. Спасают
remember,derivedStateOfи стабильные параметры; - события от пользователя: двойной тап запускает два запроса, ввод текста дёргает поиск на каждую букву. Нужны
debounce,distinctUntilChangedво Flow и защита от повторного запуска; - многопоточность: публичный метод могут вызвать с разных потоков. Если внутри общее состояние без синхронизации, частые вызовы превращают редкую гонку в регулярную.
Измерять: CPU и Memory Profiler в Android Studio, трассировка в Perfetto, StrictMode для диска и сети на главном потоке, Jetpack Macrobenchmark для скролла и старта, счётчики рекомпозиций в Layout Inspector. Для горячих путей при старте помогают Baseline Profiles.
Где спотыкаются
Предлагают сделать метод private или final «для скорости». На производительность это заметно не влияет.
Кэшируют всё подряд без инвалидации и получают устаревшие данные на экране.
Оптимизируют вслепую, не открыв профилировщик, и тратят время на метод, который занимает доли процента кадра.