Dans cette article nous allons revoir notre façon d’écrire du code Java lorsqu’il s’agit d’une application Android, il s’agit ici de la première partie.

Une question de mémoire? Oui, la mémoire est un vrai problème sur Android, ne l’oublions pas!

Revoir son java? et OUI nous allons revoir quelques pratiques utiles pour le développeur JAVA, mais très coûteux pour le développeur Android en terme de mémoire.
Avec java, nous pouvons créer des objets (un bidule considéré comme une boîte noire) à partir des types primitifs, c’est la notion de AUTOBOXING, les adeptes de java (java-hist) aiment bien manipuler les objets.
L’autoboxing peut bien faire la joie des java-hist, mais faire recours à cette notion lors du développement d’une application Android est une très mauvaise idée.
Regardons un peu cette fonction :

public int getResult(){
Integer result = 1;
for (int i = 0; i < 10; i++){
result += i;
}
return result;
}

Super! cette fonction nous retourne un objet de type int [j’aurais aimé avoir un Integer en retour très efficace si nous voulons manipuler l’objet (conversion, comparaison, etc..)], nous avons tendance à oublier ce qui se passe derrière les rideaux LA CRÉATION DES GROS OBJETS EN MÉMOIRE, c’est gérable pour une application tournant sur un serveur mais pas autant sur un smartphones ou une tablette, regardons cette fonction sous un autre angle (interprétation)

public int getResult(){
Integer result = new Integer(1);
for (int i = 0; i < 10; i++){
result = new Integer(i + result.intValue());
}
return result.intValue();
}

voilà ce que nous ne voyons pas et qui n’est pas bon ! pour la gestion de notre mémoire, des gros objets Integer seront créés en mémoire lorsque cette fonction sera exécutée, imaginons une situation où elle s’exécute dans une boucle [et n’oublions pas que le GC (garbage collector) alias ramassage de miette, le vigile de la mémoire n’intervient que lorsque nos objets ne sont plus utilisés (la mémoire est libérée)].
Il est donc préférable d’utiliser au maximum [si possible] des types primitifs ! évitons de créer des objets inutiles à partir des types primitifs.
Exemples:
Sorte de HashMap avec des clés « entiers »:
mauvaise pratique

HashMap<Integer,String> map = new HashMap<>();
map.put(550,"Echo");
map.put(551,"Echo");
map.get(550);

interprétation

HashMap<Integer,String> map = new HashMap<Integer,String>();
map.put(new Integer(550),"Echo");
map.put(new Integer(551),"Echo");
map.get(new Integer(550));

opté plutôt pour se model avec les sparseArray

SparseArray<String> map = new SparseArray<String>();
map.put(550,"Echo");
map.put(551,"Echo");
map.get(550);

Pas de autoboxing pour l’avenir surtout, tout faire pour l’éviter afin de minimiser les coûts de votre mémoire.
Nous allons poursuivre avec d’autres bonnes pratiques, ce qu’il faut faire et ne pas faire.

Post Navigation