Я не совсем уверен, что использование setHasStableId
флага решит вашу проблему. Судя по предоставленной вами информации, проблема с производительностью может быть связана с проблемой памяти. Производительность вашего приложения с точки зрения пользовательского интерфейса и памяти весьма взаимосвязана.
На прошлой неделе я обнаружил, что в моем приложении происходит утечка памяти. Я обнаружил это, потому что через 20 минут использования моего приложения я заметил, что пользовательский интерфейс работает очень медленно. Закрытие / открытие активности или прокрутка RecyclerView с кучей элементов было очень медленным. После мониторинга некоторых моих пользователей в производстве с помощью http://flowup.io/ я обнаружил следующее:
Время кадра было действительно очень высоким, а количество кадров в секунду действительно очень низким. Вы можете видеть, что для рендеринга некоторых кадров требуется около 2 секунд: S.
Пытаясь понять, что вызывает это плохое время кадра / fps, я обнаружил, что у меня проблема с памятью, как вы можете видеть здесь:
Даже когда среднее потребление памяти было близко к 15 МБ, приложение сбрасывало кадры.
Вот как я обнаружил проблему с пользовательским интерфейсом. У меня была утечка памяти в моем приложении, вызывающая множество событий сборщика мусора, и это вызывало плохую производительность пользовательского интерфейса, потому что виртуальной машине Android пришлось останавливать мое приложение, чтобы собирать память каждый отдельный кадр.
Глядя на код, у меня была утечка внутри настраиваемого представления, потому что я не отменял регистрацию слушателя из экземпляра Android Choreographer. После выхода фикса все стало нормально :)
Если ваше приложение теряет кадры из-за проблемы с памятью, вам следует проверить две распространенные ошибки:
Проверьте, выделяет ли ваше приложение объекты внутри метода, вызываемого несколько раз в секунду. Даже если это распределение может быть выполнено в другом месте, где ваше приложение становится медленным. Примером может служить создание новых экземпляров объекта внутри пользовательского метода представления onDraw на onBindViewHolder в держателе представления представления recycler. Проверьте, регистрирует ли ваше приложение экземпляр в Android SDK, но не выпускает его. Регистрация слушателя в событии шины также может быть возможной утечкой.
Отказ от ответственности: инструмент, который я использовал для мониторинга своего приложения, находится в стадии разработки. У меня есть доступ к этому инструменту, потому что я один из разработчиков :) Если вам нужен доступ к этому инструменту, мы скоро выпустим бета-версию! Вы можете присоединиться к нам на нашем веб-сайте: http://flowup.io/ .
Если вы хотите использовать разные инструменты, вы можете использовать: traveview, dmtracedump, systrace или монитор производительности Andorid, интегрированный в Android Studio. Но помните, что эти инструменты будут контролировать ваше подключенное устройство, а не остальные ваши пользовательские устройства или установки ОС Android.