/ / Simple TextView.setText provoque 40% d'utilisation du processeur - android, cpu-usage

Simple TextView.setText provoque 40% d'utilisation du processeur - android, cpu-usage

L'exécution de mon application entraîne une utilisation du processeur d'environ 40% sur mon téléphone:

final String position = String.format("%02d:%02d:%02d", time.getHours(), time.getMinutes(),
time.getSeconds());
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
c.mTxtPosition.setText(position);
...

En commentant le Définir le texte méthode, l'utilisation du processeur tombe au niveau attendude ~ 4%. La méthode est invoquée toutes les secondes et actualise ImageViews, CustomViews ... sans provoquer le même excès de charge. En plus de l'utilisation du processeur, dalvik signale en permanence le ramassage des ordures d'environ 10 à 1000 objets simplement en appelant Définir le texte().

Créer un fichier de trace comme ceci:

Debug.startMethodTracing("setText");
c.mTxtPosition.setText(position);
Debug.stopMethodTracing();

traceview répertorie les méthodes suivantes dans le top 5 selon leur% de CPU exclusif respectif:

  • ViewParent.invalidateChildInParent (16%)
  • View.requestLayout (11%)
  • ViewGroup.invalidateChild (9%)
  • TextView.setText (7%)
  • niveau supérieur (6%)

Quelqu'un a-t-il une explication à cela?

Réponses:

18 pour la réponse № 1

Je l’ai moi-même remarqué il ya quelque temps. Le problème, c’est que chaque fois que vous appelez setText, la taille de la zone de texte peut changer, ce qui oblige l’ensemble de l’écran à passer en mode relais (coûteux).

Je n'ai pas encore essayé moi-même, mais si votretextbox est simple et peut être fait pour avoir une taille relativement fixe, peut-être essayer de sous-classer TextView et créer une vue qui ne se redimensionne pas sur setText, mais dessine simplement ce qu'elle peut dans la zone existante? Cela ferait gagner beaucoup de temps.

Peut-être y a-t-il déjà un drapeau à définir qui puisse le faire, mais je ne suis pas au courant, bien que je n’aie pas cherché de plus près.


2 pour la réponse № 2

Dans mon cas, j'ai mis à jour un événement TextView from touch, ce qui a entraîné beaucoup de mises à jour. La solution consistait à modifier TextView layout_width & layout_height en taille fixe.


1 pour la réponse № 3

quelques améliorations possibles:

  1. essayez d'utiliser un gestionnaire qui met à jour la vue texte toutes les 0,5 seconde au lieu d'un thread qui le fait.
  2. faire du runnable un objet constant final au lieu d'en créer un nouveau toutes les secondes.
  3. Pensez à vérifier que l'heure a changé (newTimeInMs-LastPublishedTimeInMs> = 1000) avant d'indiquer à la vue de texte de se mettre à jour.
  4. au lieu de String.format, essayez d’utiliser StringBuilder. Cependant, vous ne pourrez pas profiter de la solution de paramètres régionaux fournie par String.format (par exemple, pour les chiffres arabes).

0 pour la réponse № 4

Dans mon cas, il s'agissait de la propriété de TextView:

android:ellipsize="marquee"

Le supprimer a accéléré le réglage du texte.