Nie jestem pewien, czy użycie setHasStableId
flagi rozwiąże Twój problem. Na podstawie podanych informacji Twój problem z wydajnością może być związany z problemem z pamięcią. Wydajność aplikacji pod względem interfejsu użytkownika i pamięci jest dość powiązana.
W zeszłym tygodniu odkryłem, że moja aplikacja przecieka pamięć. Odkryłem to, ponieważ po 20 minutach korzystania z mojej aplikacji zauważyłem, że interfejs użytkownika działa bardzo wolno. Zamykanie / otwieranie działania lub przewijanie RecyclerView z kilkoma elementami było naprawdę powolne. Po monitorowaniu niektórych moich użytkowników w produkcji za pomocą http://flowup.io/ znalazłem to:
Czas klatek był naprawdę wysoki, a liczba klatek na sekundę naprawdę niska. Jak widać, niektóre klatki potrzebowały około 2 sekund na renderowanie: S.
Próbując dowiedzieć się, co powodowało ten zły czas wyświetlania klatek / fps, odkryłem, że mam problem z pamięcią, jak widać tutaj:
Nawet gdy średnie zużycie pamięci było bliskie 15 MB, w tym samym czasie aplikacja gubiła klatki.
W ten sposób odkryłem problem z interfejsem użytkownika. Miałem wyciek pamięci w mojej aplikacji, powodując wiele zdarzeń odśmiecania pamięci, co powodowało złą wydajność interfejsu użytkownika, ponieważ maszyna wirtualna z systemem Android musiała zatrzymać moją aplikację, aby zebrać pamięć w każdej klatce.
Patrząc na kod, miałem wyciek w widoku niestandardowym, ponieważ nie wyrejestrowywałem nasłuchiwania z instancji Android Choreographer. Po wypuszczeniu poprawki wszystko wróciło do normy :)
Jeśli Twoja aplikacja gubi ramki z powodu problemu z pamięcią, zapoznaj się z dwoma typowymi błędami:
Sprawdź, czy Twoja aplikacja alokuje obiekty wewnątrz metody wywoływanej wiele razy na sekundę. Nawet jeśli ta alokacja może zostać wykonana w innym miejscu, w którym aplikacja staje się wolniejsza. Przykładem może być tworzenie nowych instancji obiektu wewnątrz niestandardowej metody widoku onDraw w onBindViewHolder w uchwycie widoku recyklera. Sprawdź, czy Twoja aplikacja rejestruje wystąpienie w Android SDK, ale go nie zwalnia. Zarejestrowanie słuchacza w zdarzeniu autobusowym może być również możliwym wyciekiem.
Zastrzeżenie: narzędzie, którego używam do monitorowania mojej aplikacji, jest w trakcie opracowywania. Mam dostęp do tego narzędzia, ponieważ jestem jednym z programistów :) Jeśli chcesz mieć dostęp do tego narzędzia, wkrótce udostępnimy wersję beta! Możesz dołączyć na naszej stronie internetowej: http://flowup.io/ .
Jeśli chcesz korzystać z różnych narzędzi, możesz użyć: traveview, dmtracedump, systrace lub monitora wydajności Andorid zintegrowanego z Android Studio. Pamiętaj jednak, że te narzędzia będą monitorować podłączone urządzenie, a nie pozostałe urządzenia użytkowników lub instalacje systemu operacyjnego Android.