Hola Habr! En este artículo, dirigido a principiantes, me gustaría dar algunos consejos sobre cómo optimizar el uso de la memoria del dispositivo por parte de la aplicación, para no obtener constantemente OutOfMemory, y también considerar el uso de imágenes vectoriales en la versión actual actual de Android Studio (3.4), ya que la mayoría de los recursos en ruso en este El tema (el último
artículo sobre Habré sobre imágenes vectoriales data de 2015) está desactualizado, lo que a menudo engaña a los desarrolladores novatos. Entonces comencemos.
1. Use imágenes vectoriales en lugar de mapas de bits
Por supuesto, las imágenes grandes con muchos detalles pequeños no deben convertirse en un vector; esto ocupará tanto espacio como un ráster, si no más. Sin embargo, las imágenes pequeñas, como los iconos y otros detalles de la interfaz de usuario, deben convertirse en un vector para ahorrar memoria. Y trabajar con
imágenes vectoriales suele ser mucho más conveniente. Y ahora, lo más importante: ¿cómo hacerlo?
- Abra Android Studio.
- Haga clic derecho en la carpeta dibujable o su contenido> Nuevo> Activo vectorial

- Especifique la ruta a su archivo svg. Si su imagen tiene una forma irregular, le aconsejo que marque la casilla junto al parámetro Anulación; de lo contrario, la imagen se ajustará a los tamaños estándar, lo que puede distorsionar sus proporciones.

- Siguiente> Finalizar
- Hecho
Para convertir de ráster a vector, puedo recomendar una excelente aplicación gratuita de
Inkscape . Un poco sobre trabajar con él:
- Abra Inkscape.
- Arrastra cualquier ráster hacia él. En la ventana que se abre, seleccione las opciones de importación y haga clic en Aceptar.
- En la barra de herramientas superior, después de seleccionar nuestra imagen, seleccione Ruta> Vectorizar ráster (Shift + Alt + B).
- Ahora lo más importante. En la nueva ventana, marque la casilla junto a "Eliminar fondo" y seleccione lo siguiente: si nuestra imagen será en color y cuántos escaneos realizar. No debemos olvidar que el tamaño de nuestro archivo vectorial depende directamente de estos dos parámetros.
Más escaneos: más colores, matices y detalles. Mi duende, para adquirir una apariencia divina, debido a la mayor cantidad de colores en la imagen, se requirieron 30 escaneos. Esto es bastante, es mejor no hacer más de diez y elegir imágenes más fácilmente.

- Cierre la ventana, haga clic en el ráster y elimínelo con la tecla Eliminar, vaya a Archivo> Propiedades del documento (Shift + Ctrl + D), ajuste el tamaño de página para el contenido.
Ahora realizaremos una pequeña prueba que demuestre la ventaja del vector en el ahorro de memoria.
Creé un nuevo proyecto con un solo ImageView, al que apliqué una animación que lo mueve del punto A al punto B, cambiando alternativamente las imágenes a ráster y vector. Nos fijamos en los datos.
Trama

Vector

La diferencia es casi dos veces. Creo que esto es bastante convincente.
2. Aumente el tamaño del montón
Para hacer esto, vaya al manifiesto de su proyecto (aplicación> manifiestos> AndroidManifest.xml) y agregue la línea en la columna de la aplicación:
android:largeHeap="true"
De hecho, aumentar el almacenamiento dinámico no es una solución al problema OutOfMemory, sino más bien llevarlo al estante más alejado. En lugar de optimizar el uso de la aplicación de la memoria del dispositivo, le damos más espacio. No olvide que cada dispositivo tiene su propia capacidad de memoria, tanto primaria como secundaria, asignada para la aplicación.
3. Evitar pérdidas de memoria
Cualquier aplicación en su trabajo utiliza muchos objetos que, por supuesto, ocupan un cierto lugar en la memoria. Idealmente, el recolector de basura debería eliminar los objetos no utilizados, pero a veces hay las llamadas "pérdidas de memoria" que causan serios problemas en la aplicación. Hay varias causas de pérdidas de memoria, que se describen en detalle
aquí .
Por mi cuenta, me gustaría aconsejar la biblioteca
WeakHandler , desarrollada por Badoo, y diseñada para eliminar las pérdidas de memoria asociadas con el mal uso de android.os.Handler. Para usar esta biblioteca, agregue la siguiente línea a su columna de dependencias en su archivo gradle (Gradle Scripts> build.gradle (Módulo: aplicación)):
compile 'com.badoo.mobile:android-weak-handler:1.1'
y en el archivo 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); }
Y no olvide importar WeakHandler si el estudio no lo hizo automáticamente.
4. Evite grandes animaciones de lapso de tiempo
La animación cuadro por cuadro en Android Studio es algo conveniente, pero no el más económico. Si utiliza una gran cantidad de imágenes, seguramente obtendrá OutOfMemory.
Pero, si realmente lo necesita, es mejor usar la imagen gif junto con la biblioteca de
Android Gif Drawable . Esta biblioteca simplifica el trabajo con gifs y también consume mucha menos memoria que las animaciones cuadro por cuadro de Android Studio. Para usar esta biblioteca, agregue la siguiente línea a su columna de dependencias en su archivo gradle (Gradle Scripts> build.gradle (Módulo: aplicación)):
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16'
y en su segundo archivo gradle (Gradle Scripts> build.gradle (Módulo: "el nombre de su aplicación")) en las columnas buildscript y allproject la línea:
mavenCentral()
y en el archivo java:
GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable._ ); gifFromResource.start();
Para deshabilitar gif, en lugar de start (), escribe stop (). Además, no olvide comprimir gifs, esto ahorrará aún más espacio.
Espero que mi artículo te haya sido útil. Gracias