Pourquoi les poids nesteds sont-ils mauvais pour la performance? Des alternatives?

J’ai écrit quelques fichiers de mise en page où j’ai utilisé l’atsortingbut layout_weight pour créer un rapport entre différentes vues.

À un moment donné, je commence à recevoir des avertissements de peluches sur les poids nesteds.

Donc, je me demande pourquoi les poids nesteds sont mauvais pour les performances et s’il existe un moyen plus efficace de créer un rapport constant entre les dimensions de vue pouvant être utilisées pour différentes tailles d’écran et qui n’a pas besoin de spécifier à travers plusieurs fichiers de mise en page (pour différentes tailles d’écran, je veux dire).

Je vous remercie!

Les poids nesteds sont mauvais pour la performance car:

Les poids de mise en page nécessitent qu’un widget soit mesuré deux fois. Lorsqu’un LinearLayout avec des pondérations non nulles est nested dans un autre LinearLayout avec des pondérations non nulles, le nombre de mesures augmente de manière exponentielle.

Il est toujours préférable d’utiliser RelativeLayout s et d’ajuster votre vue en fonction des emplacements des autres vues sans utiliser de valeurs ppp spécifiques.

Mise à jour: Comme nous le soaps, la bibliothèque du support de pourcentage est obsolète au niveau 26 de l’API. ConstraintLayout est la nouvelle méthode permettant d’obtenir la même structure XML plate.

Projet Github mis à jour

Échantillons mis à jour:

     

Mise à jour: La bibliothèque de support de pourcentage d’Android de grandes nouvelles résout notre problème de performance et LinearLayout pondéré désordonné nested

 comstack 'com.android.support:percent:23.0.0' 

Démo ICI

Considérez cette disposition simple pour démontrer la même chose.

pourcentage de soutien démo libray

     

Dégradé de performance évité nested LinearLayout avec des poids. Vraiment génial !!!.

Je pense (et je vais probablement être flambé pour cela), mais encore une fois je pense que mon téléphone a un processeur quad core pour rivaliser (voire détruire complètement) la plupart des PC à la maison.

Je pense également que ce type de capacité matérielle est l’avenir des téléphones.

Donc, je parviens à une conclusion, que tant que vous ne vous laissez pas emporter par l’imbrication (dans MHO, une mise en page ne doit jamais avoir plus de 4 niveaux de profondeur, et si c’est le cas, votre téléphone s’en fout) à propos d’avoir des poids.

Il y a beaucoup de choses que vous pouvez faire qui auront un effet beaucoup plus important sur les performances, puis vous soucier que votre processeur fasse des calculs supplémentaires.

(notez bien que je suis un peu humoristique, et donc ne prenez rien de trop sérieux dans cet article, à part l’idée qu’il y a d’autres choses à optimiser en premier, et que s’inquiéter d’un poids profond de 2 à 3 niveaux n’aide pas votre santé)

La principale raison pour laquelle les poids nesteds sont mauvais est que, quand une mise en page a des enfants avec un poids, elle doit être mesurée deux fois (je pense que cela est mentionné dans l’avertissement de peluches). Cela signifie qu’une mise en page pondérée contenant également une disposition pondérée doit être mesurée quatre fois et que chaque couche de pondération que vous ajoutez augmente les mesures avec une puissance de deux.

Dans ICS (API niveau 14), GridLayout été ajouté, ce qui permet des solutions simples et «plates» pour de nombreuses configurations nécessitant auparavant des pondérations. Si vous développez pour des versions antérieures d’Android vous aurez un peu plus de mal à supprimer des poids, mais l’utilisation d’un RelativeLayout et l’aplatissement autant que possible de votre mise en page dans cette cabine suppriment généralement beaucoup de poids nesteds.

Je pense que la seule alternative est de créer une fonction appelée onResume et de définir toutes les tailles et positions. Quoi qu’il en soit, en poids, vous ne pouvez définir que des tailles mais pas de remplissage (les mises en page deviennent alors encore plus compliquées), pas de taille de texte (impossible à compenser), et encore moins de nombre de lignes.