Se você deve usar (e reter) uma grande quantidade de memória, então sim, você pode e deve usar android:largeHeap="true"
. Mas se você usá-lo, deve estar preparado para esvaziar seu aplicativo da memória sempre que outros aplicativos estiverem em primeiro plano.
Por "estar preparado", quero dizer que você deve projetar para essa probabilidade, de modo que seus métodos onStop()
e onResume()
sejam escritos da forma mais eficiente possível, enquanto garante que todo o estado pertinente seja salvo e restaurado de uma maneira que apresente uma aparência perfeita para o usuário.
Existem três métodos que se relacionam com este parâmetro: maxMemory()
, getMemoryClass()
, e getLargeMemoryClass()
.
Para a maioria dos dispositivos, maxMemory()
representará um valor semelhante a getMemoryClass()
por padrão, embora o último seja expresso em megabytes, enquanto o primeiro seja expresso em bytes.
Quando você usa o largeHeap
parâmetro, maxMemory()
será aumentado para um nível superior específico do dispositivo, enquanto getMemoryClass()
permanecerá o mesmo.
getMemoryClass()
não restringe o tamanho do heap, mas informa a quantidade de heap que você deve usar se quiser que seu aplicativo funcione de maneira confortável e compatível dentro dos limites do dispositivo específico no qual você está executando.
maxMemory()
, Pelo contrário, não restringir o seu tamanho da pilha, e assim você faz ter acesso a pilha adicional através do aumento do seu valor, e largeHeap
faz aumentar esse valor. No entanto, a quantidade aumentada de heap ainda é limitada e esse limite será específico do dispositivo, o que significa que a quantidade de heap disponível para seu aplicativo irá variar, dependendo dos recursos do dispositivo no qual seu aplicativo está sendo executado. Portanto, usar largeHeap
não é um convite para que seu aplicativo abandone todo cuidado e abra caminho no buffet livre.
Seu aplicativo pode descobrir exatamente quanta memória seria disponibilizada em um dispositivo específico usando o largeHeap
parâmetro invocando o método getLargeMemoryClass()
. O valor retornado está em megabytes.
Esta postagem anterior inclui uma discussão sobre o largeHeap
parâmetro, bem como uma série de exemplos de quais quantidades de heap são disponibilizadas com e sem seu uso, em vários dispositivos Android específicos:
Detectar o tamanho do heap do aplicativo no Android
Não implantei nenhum dos meus próprios aplicativos com este parâmetro definido como verdadeiro. No entanto, tenho algum código que consome muita memória em um de meus aplicativos para compilar um conjunto de parâmetros relacionados à otimização, que é executado apenas durante o desenvolvimento. Eu adiciono o largeHeap
parâmetro apenas durante o desenvolvimento, para evitar erros de falta de memória ao executar este código. Mas eu removo o parâmetro (e o código) antes de implantar o aplicativo.