Passei 4 dias inteiros tentando de tudo para descobrir o vazamento de memória em um aplicativo que estou desenvolvendo, mas as coisas deixaram de fazer sentido há muito tempo.
O aplicativo que estou desenvolvendo é de natureza social, então pense no perfil de Atividades (P) e liste Atividades com dados - por exemplo, emblemas (B). Você pode pular de um perfil para uma lista de emblemas, para outros perfis, para outras listas, etc.
Então imagine um fluxo como este P1 -> B1 -> P2 -> B2 -> P3 -> B3, etc. Para consistência, estou carregando perfis e emblemas do mesmo usuário, então cada página P é a mesma e assim é cada página B.
A essência geral do problema é: depois de navegar um pouco, dependendo do tamanho de cada página, recebo uma exceção de falta de memória em locais aleatórios - bitmaps, strings, etc - não parece ser consistente.
Depois de fazer tudo que você pode imaginar para descobrir por que estou ficando sem memória, não encontrei nada. O que não entendo é por que o Android não está matando P1, B1, etc, se ficar sem memória ao carregar e, em vez disso, travar. Eu esperaria que essas atividades anteriores morressem e fossem ressuscitadas se eu voltasse a elas via onCreate () e onRestoreInstanceState ().
Sem falar nisso - mesmo se eu fizer P1 -> B1 -> Voltar -> B1 -> Voltar -> B1, ainda assim recebo um travamento. Isso indica algum tipo de vazamento de memória, mas mesmo depois de despejar hprof e usar MAT e JProfiler, não consigo identificá-lo.
Desativei o carregamento de imagens da web (e aumentei os dados de teste carregados para compensar e tornar o teste justo) e certifiquei-me de que o cache de imagem usa SoftReferences. Na verdade, o Android tenta liberar as poucas SoftReferences que possui, mas logo antes de perder memória.
As páginas do Badge obtêm dados da web, carregam-nos em um array de EntityData de um BaseAdapter e enviam para um ListView (na verdade estou usando o excelente MergeAdapter do CommonsWare , mas nesta atividade do Badge, há realmente apenas 1 adaptador, mas eu queria mencionar esse fato de qualquer maneira).
Eu examinei o código e não consegui encontrar nada que vazasse. Limpei e anulei tudo que pude encontrar e até mesmo System.gc () à esquerda e à direita, mas ainda assim o aplicativo trava.
Ainda não entendo por que as atividades inativas que estão na pilha não são colhidas e eu realmente adoraria descobrir isso.
Neste ponto, estou procurando por dicas, conselhos, soluções ... qualquer coisa que possa ajudar.
Obrigado.
outOfMemory
erro. Obrigado!