Não tenho certeza se o uso do setHasStableId
sinalizador resolverá seu problema. Com base nas informações fornecidas, seu problema de desempenho pode estar relacionado a um problema de memória. O desempenho do seu aplicativo em termos de interface de usuário e memória está bastante relacionado.
Na semana passada, descobri que meu aplicativo estava perdendo memória. Descobri isso porque, após 20 minutos de uso do meu aplicativo, percebi que o desempenho da IU estava muito lento. Fechar / abrir uma atividade ou rolar um RecyclerView com um monte de elementos era muito lento. Depois de monitorar alguns dos meus usuários em produção usando http://flowup.io/ , descobri o seguinte:
O tempo de fotogramas foi muito alto e os fotogramas por segundo muito baixos. Você pode ver que alguns quadros precisaram de cerca de 2 segundos para renderizar: S.
Tentando descobrir o que estava causando esse tempo / fps de quadro ruim, descobri que tinha um problema de memória, como você pode ver aqui:
Mesmo quando o consumo médio de memória estava próximo dos 15 MB, ao mesmo tempo, o aplicativo estava perdendo frames.
Foi assim que descobri o problema da IU. Eu tive um vazamento de memória em meu aplicativo causando muitos eventos de coletor de lixo e isso estava causando o mau desempenho da IU porque a VM Android teve que parar meu aplicativo para coletar memória a cada quadro.
Olhando para o código, tive um vazamento dentro de uma visualização personalizada porque não estava cancelando o registro de um ouvinte da instância do Android Choreographer. Depois de lançar a correção, tudo voltou ao normal :)
Se seu aplicativo está perdendo frames devido a um problema de memória, você deve revisar dois erros comuns:
Verifique se o seu aplicativo está alocando objetos dentro de um método invocado várias vezes por segundo. Mesmo que essa alocação possa ser realizada em um local diferente, onde seu aplicativo esteja se tornando lento. Um exemplo poderia ser a criação de novas instâncias de um objeto dentro de um método de visualização personalizada onDraw em onBindViewHolder em seu suporte de visualização do reciclador. Verifique se o seu aplicativo está registrando uma instância no Android SDK, mas não está liberando-a. Registrar um ouvinte em um evento de barramento também pode ser um vazamento possível.
Isenção de responsabilidade: a ferramenta que uso para monitorar meu aplicativo está em desenvolvimento. Eu tenho acesso a essa ferramenta porque sou um dos desenvolvedores :) Se você quiser ter acesso a essa ferramenta, lançaremos uma versão beta em breve! Você pode participar em nosso site: http://flowup.io/ .
Se você quiser usar ferramentas diferentes, pode usar: traveview, dmtracedump, systrace ou o monitor de desempenho Andorid integrado ao Android Studio. Mas lembre-se de que essas ferramentas irão monitorar seu dispositivo conectado e não o resto de seus dispositivos de usuário ou instalações do sistema operacional Android.