OutOfMemory e o uso de imagens vetoriais no Android Studio

Olá Habr! Neste artigo, destinado a iniciantes, gostaria de dar algumas dicas sobre como otimizar o uso da memória do dispositivo pelo aplicativo, para não obter constantemente o OutOfMemory, e também considerar o uso de imagens vetoriais na versão atual atual do Android Studio (3.4), uma vez que a maioria dos recursos de idioma russo neste O tópico (o último artigo sobre Habré sobre imagens vetoriais remonta a 2015) está desatualizado, o que geralmente engana desenvolvedores iniciantes. Então, vamos começar.

1. Use imagens vetoriais em vez de bitmaps


Obviamente, imagens grandes com muitos pequenos detalhes não devem ser convertidas em um vetor - isso ocupará tanto espaço quanto uma varredura, se não mais. No entanto, imagens pequenas, como ícones e outros detalhes da interface do usuário, devem ser convertidas em um vetor para economizar memória. E trabalhar com imagens vetoriais geralmente é muito mais conveniente. E agora, a coisa mais importante - como fazer isso?

  1. Abra o Android Studio.
  2. Clique com o botão direito do mouse na pasta extraível ou em seu conteúdo> Novo> Ativo de Vetor

  3. Especifique o caminho para o seu arquivo svg. Se sua imagem tiver uma forma irregular, recomendamos que você marque a caixa ao lado do parâmetro Substituir - caso contrário, a imagem será ajustada para tamanhos padrão, o que pode distorcer suas proporções.

  4. Próximo> Concluir
  5. Feito!

Para converter de raster para vetor, posso recomendar um excelente aplicativo gratuito do Inkscape . Um pouco sobre como trabalhar com ele:

  1. Abra o Inkscape.
  2. Arraste qualquer raster para dentro dele. Na janela que se abre, selecione as opções de importação e clique em OK.
  3. Na barra de ferramentas superior, depois de selecionar nossa imagem, selecione Caminho> Vetorizar varredura (Shift + Alt + B).
  4. Agora a coisa mais importante. Na nova janela, marque a caixa ao lado de "Remover plano de fundo" e selecione o seguinte: se nossa imagem será colorida e quantas digitalizações serão feitas. Não devemos esquecer que o tamanho do nosso arquivo vetorial depende diretamente desses dois parâmetros.

    Mais digitalizações - mais cores, tons e detalhes. Meu duende, para adquirir uma aparência divina, devido ao maior número de cores na imagem, foram necessárias 30 digitalizações. Isso é bastante, é melhor não fazer mais do que dez e escolher as fotos mais facilmente.

  5. Feche a janela, clique na varredura e exclua-a com a tecla Delete, vá para Arquivo> Propriedades do documento (Shift + Ctrl + D), ajuste o tamanho da página para o conteúdo.

Agora, faremos um pequeno teste comprovando a vantagem do vetor na economia de memória.
Criei um novo projeto com um único ImageView, ao qual apliquei uma animação que a move do ponto A para o ponto B, alterando alternadamente as imagens para raster e vetor. Nós olhamos para os dados.

Raster



Vetor



A diferença é quase duas vezes. Eu acho que isso é bastante convincente.

2. Aumente o tamanho da pilha


Para fazer isso, acesse o manifesto do seu projeto (app> manifestos> AndroidManifest.xml) e adicione a linha na coluna do aplicativo:

android:largeHeap="true" 

De fato, aumentar o heap não é uma solução para o problema OutOfMemory, mas empurrá-lo para a prateleira remota. Em vez de otimizar o uso da memória do dispositivo, oferecemos mais espaço. Não esqueça que cada dispositivo possui sua própria capacidade de memória, primária e secundária, alocada para o aplicativo.

3. Evite vazamentos de memória


Qualquer aplicação em seu trabalho utiliza muitos objetos que, é claro, ocupam um determinado lugar na memória. Idealmente, o coletor de lixo deve remover objetos não utilizados, mas às vezes existem os chamados "vazamentos de memória" que causam sérios problemas no aplicativo. Existem várias causas de vazamentos de memória, que são descritas em detalhes aqui .

Por conta própria, gostaria de aconselhar a biblioteca WeakHandler , desenvolvida pelo Badoo, e projetada para eliminar vazamentos de memória associados ao uso indevido do android.os.Handler. Para usar esta biblioteca, inclua a seguinte linha na coluna de suas dependências no arquivo gradle (Scripts da Gradle> build.gradle (Módulo: app)):

 compile 'com.badoo.mobile:android-weak-handler:1.1' 

e no arquivo java:

 private WeakHandler mHandler; protected void onCreate(Bundle savedInstanceState) { mHandler = new WeakHandler(); ... } private void onClick(View view) { mHandler.postDelayed(new Runnable() { view.setVisibility(View.INVISIBLE); }, 5000); } 

E não se esqueça de importar o próprio WeakHandler se o estúdio não fizer isso automaticamente.

4. Evite grandes animações de lapso de tempo


A animação quadro a quadro no Android Studio é uma coisa conveniente, mas não a mais econômica. Se você usar um grande número de imagens, certamente obterá OutOfMemory.

Mas, se você realmente precisava, é melhor usar a imagem gif junto com a biblioteca Drawable GIF para Android . Essa biblioteca simplifica o trabalho com gifs e também consome muito menos memória do que as animações quadro a quadro do Android Studio. Para usar esta biblioteca, inclua a seguinte linha na coluna de suas dependências no arquivo gradle (Scripts da Gradle> build.gradle (Módulo: app)):

 implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16' 

e no seu segundo arquivo gradle (Scripts Gradle> build.gradle (Módulo: “nome do seu aplicativo”)) nas colunas buildscript e allproject, a linha:

 mavenCentral() 

e no arquivo java:

 GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable._ ); gifFromResource.start(); 

Para desativar o gif, em vez de start (), escreva stop (). Também não se esqueça de compactar gifs, isso economizará ainda mais espaço.

Espero que meu artigo tenha sido útil para você. Obrigada

Source: https://habr.com/ru/post/pt450566/


All Articles