Я не впевнений, чи використання setHasStableId
прапора вирішить вашу проблему. На основі інформації, яку ви надаєте, проблема з продуктивністю може бути пов’язана з проблемою пам’яті. Продуктивність вашої програми з точки зору користувальницького інтерфейсу та пам’яті досить пов’язана.
Минулого тижня я виявив, що мій додаток витікає з пам’яті. Я виявив це, оскільки через 20 хвилин використання мого додатка я помітив, що інтерфейс працював дуже повільно. Закриття / відкриття дії або прокрутка RecyclerView з безліччю елементів було дуже повільним. Після моніторингу деяких моїх користувачів у виробництві за допомогою http://flowup.io/ я виявив:
Час кадру був справді дуже високий, а частота кадрів в секунду дуже мала. Ви бачите, що деяким кадрам для рендерингу знадобилося близько 2 секунд: S.
Намагаючись зрозуміти, що спричиняє цей невдалий час / кадр в секунду, я виявив, що у мене проблема з пам’яттю, як ви можете бачити тут:
Навіть коли середнє споживання пам'яті було близько 15 Мб, у той самий час програма скидала кадри.
Так я виявив проблему з інтерфейсом користувача. У моєму додатку стався витік пам’яті, що спричинило багато подій збирача сміття, і це спричинило погану продуктивність інтерфейсу, оскільки Android VM повинен був зупинити мою програму, щоб збирати пам’ять кожен окремий кадр.
Дивлячись на код, у мене просочився користувацький вигляд, оскільки я не відмінив реєстрацію слухача з екземпляра Android Choreographer. Після випуску виправлення все стало нормально :)
Якщо ваш додаток скидає кадри через проблему з пам'яттю, слід переглянути дві типові помилки:
Перевірте, чи додаток виділяє об’єкти всередині методу, який викликається кілька разів на секунду. Навіть якщо цей розподіл можна виконати в іншому місці, де ваша заявка стає повільною. Прикладом може бути створення нових екземплярів об'єкта всередині методу нестандартного подання onDraw на onBindViewHolder у власнику подання подання утилізатора. Перевірте, чи ваш додаток реєструє екземпляр в Android SDK, але не випускає його. Реєстрація слухача в автобусній події також може бути можливим.
Застереження: Інструмент, який я використовую для моніторингу мого додатка, знаходиться в стадії розробки. Я маю доступ до цього інструменту, тому що я один з розробників :) Якщо ви хочете отримати доступ до цього інструменту, ми скоро випустимо бета-версію! Ви можете приєднатися до нашого веб-сайту: http://flowup.io/ .
Якщо ви хочете використовувати різні інструменти, які ви можете використовувати: traveview, dmtracedump, systrace або монітор продуктивності Andorid, інтегрований в Android Studio. Але пам’ятайте, що ці інструменти контролюватимуть ваш підключений пристрій, а не решту ваших користувацьких пристроїв чи інсталяцій ОС Android.