Bonjour, Habr! Dans cet article, destiné aux débutants, je voudrais donner quelques conseils sur l'optimisation de l'utilisation de la mémoire de l'appareil par l'application, afin de ne pas obtenir constamment OutOfMemory, et envisager également l'utilisation d'images vectorielles dans la version actuelle actuelle d'Android Studio (3.4), car la plupart des ressources en russe sur ce Le sujet (le dernier
article sur Habré sur les images vectorielles remonte à 2015) est dépassé, ce qui trompe souvent les développeurs débutants. Commençons donc.
1. Utilisez des images vectorielles au lieu de bitmaps
Bien sûr, les grandes images avec de nombreux petits détails ne doivent pas être converties en vecteur - cela prendra autant d'espace qu'un raster, sinon plus. Cependant, de petites images, telles que des icônes et d'autres détails de l'interface utilisateur doivent être converties en un vecteur afin d'économiser de la mémoire. Et travailler avec
des images vectorielles est souvent beaucoup plus pratique. Et maintenant, la chose la plus importante - comment faire?
- Ouvrez Android Studio.
- Cliquez avec le bouton droit sur le dossier dessinable ou son contenu> Nouveau> Élément vectoriel

- Spécifiez le chemin d'accès à votre fichier svg. Si votre image a une forme irrégulière, je vous conseille de cocher la case à côté du paramètre Override - sinon l'image sera ajustée à des tailles standard, ce qui peut déformer ses proportions.

- Suivant> Terminer
- C'est fait!
Pour la conversion de raster en vecteur, je peux recommander une excellente application
Inkscape gratuite. Un peu de travail avec lui:
- Ouvrez Inkscape.
- Faites-y glisser n'importe quel raster. Dans la fenêtre qui s'ouvre, sélectionnez les options d'importation et cliquez sur OK.
- Dans la barre d'outils supérieure, après avoir sélectionné notre image, sélectionnez Chemin> Vectoriser le raster (Maj + Alt + B).
- Maintenant, la chose la plus importante. Dans la nouvelle fenêtre, cochez la case à côté de "Supprimer l'arrière-plan" et sélectionnez ce qui suit: si notre image sera en couleur et combien de numérisations effectuer. Il ne faut pas oublier que la taille de notre fichier vectoriel dépend directement de ces deux paramètres.
Plus de numérisations - plus de couleurs, de nuances et de détails. Mon lutin, afin d'acquérir une apparence divine, en raison du plus grand nombre de couleurs dans l'image, 30 numérisations ont été nécessaires. C'est beaucoup, il vaut mieux ne pas en faire plus de dix et choisir des photos plus facilement.

- Fermez la fenêtre, cliquez sur le raster et supprimez-le avec la touche Supprimer, allez dans Fichier> Propriétés du document (Maj + Ctrl + D), ajustez la taille de la page pour le contenu.
Nous allons maintenant effectuer un petit test prouvant l'avantage du vecteur dans la sauvegarde de la mémoire.
J'ai créé un nouveau projet avec une seule ImageView, à laquelle j'ai appliqué une animation qui le déplace d'un point A à un point B, changeant alternativement les images en raster et vecteur. Nous regardons les données.
Raster

Vecteur

La différence est presque deux fois. Je pense que c'est assez convaincant.
2. Augmentez la taille du tas
Pour ce faire, accédez au manifeste de votre projet (app> manifestes> AndroidManifest.xml) et ajoutez la ligne dans la colonne application:
android:largeHeap="true"
En fait, augmenter le tas n'est pas une solution au problème OutOfMemory, mais plutôt le pousser vers l'étagère éloignée. Au lieu d'optimiser l'utilisation de la mémoire de l'appareil par l'application, nous lui donnons plus d'espace. N'oubliez pas que chaque appareil a sa propre capacité de mémoire, à la fois principale et secondaire, allouée à l'application.
3. Évitez les fuites de mémoire
Toute application dans son travail utilise de nombreux objets qui, bien sûr, occupent une certaine place dans la mémoire. Idéalement, le garbage collector devrait en retirer les objets inutilisés, mais parfois il y a des soi-disant «fuites de mémoire» qui causent de graves problèmes dans l'application. Il existe différentes causes de fuites de mémoire, qui sont décrites en détail
ici .
Pour ma part, je voudrais conseiller la bibliothèque
WeakHandler , développée par Badoo, et conçue pour éliminer les fuites de mémoire associées à la mauvaise utilisation de android.os.Handler. Pour utiliser cette bibliothèque, ajoutez la ligne suivante à votre colonne de dépendances dans votre fichier gradle (Gradle Scripts> build.gradle (Module: app)):
compile 'com.badoo.mobile:android-weak-handler:1.1'
et dans le fichier 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); }
Et n'oubliez pas d'importer WeakHandler lui-même si le studio ne l'a pas fait automatiquement.
4. Évitez les grandes animations time-lapse
L'animation image par image dans Android Studio est une chose pratique, mais pas la plus économique. Si vous utilisez un grand nombre d'images, vous obtiendrez certainement OutOfMemory.
Mais, si vous en avez vraiment besoin, il est préférable d'utiliser l'image gif avec la bibliothèque
Android Gif Drawable . Cette bibliothèque simplifie le travail avec les gifs et consomme également beaucoup moins de mémoire que les animations image par image d'Android Studio. Pour utiliser cette bibliothèque, ajoutez la ligne suivante à votre colonne de dépendances dans votre fichier gradle (Gradle Scripts> build.gradle (Module: app)):
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16'
et dans votre deuxième fichier Gradle (Gradle Scripts> build.gradle (Module: «votre nom d'application»)) dans les colonnes buildscript et allproject, la ligne:
mavenCentral()
et dans le fichier java:
GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable._ ); gifFromResource.start();
Pour désactiver gif, au lieu de start (), écrivez stop (). N'oubliez pas non plus de compresser les gifs, cela économisera encore plus d'espace.
J'espère que mon article vous a été utile. Je vous remercie