Simple TextView.setText provoca un 40% de uso de CPU


Ejecutar mi aplicación causa ~40% de uso de CPU en mi teléfono:

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);
         ...

Comentando el método setText el uso de CPU cae al nivel esperado de ~4%. El método se invoca cada segundo y actualiza ImageViews, CustomViews ... sin causar el mismo exceso de carga. Además del Uso de CPU, dalvik informa constantemente de la recolección de basura de alrededor de 10-1000 objetos con solo llamar a setText().

Creando un archivo de seguimiento como esto:

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

Traceview enumera los siguientes métodos como Top 5 por su respectivo % exclusivo de CPU:

  • ViewParent.invalidateChildInParent (16%)
  • Vista.Distribución de la solicitud (11%)
  • ViewGroup.Hijo inválido (9%)
  • TextView.setText (7%)
  • nivel superior (6%)

¿Alguien tiene una explicación para esto?

Author: phlebas, 2012-05-29

4 answers

Me di cuenta de esto hace un tiempo, creo que el problema es que cada vez que llame a setText, el tamaño del cuadro de texto puede cambiar, lo que requiere que toda la pantalla pase por relayout (caro).

Todavía no he probado esto, pero si su cuadro de texto es simple y se puede hacer que sea de un tamaño relativamente fijo, tal vez intente subclasificar TextView y crear una vista que no se redimensione en setText, sino que simplemente dibuje lo que pueda en el área existente. Eso ahorraría mucho del tiempo.

Tal vez ya hay una bandera para setText que puede hacer que haga esto, pero no soy consciente de ello, aunque no he buscado de cerca.

 18
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-29 19:13:56

En mi caso, actualizo un evento TextView desde touch, lo que causa una gran cantidad de actualización La solución fue cambiar el TextView layout_width & layout_height a tamaño fijo.

 2
Author: shmulik.r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-22 05:52:01

Algunas mejoras posibles:

  1. intente usar un controlador que actualice textview cada 0.5 segundos en lugar de un hilo que lo haga.
  2. haga que el ejecutable sea un objeto constante final en lugar de generar uno nuevo cada segundo.
  3. considere verificar que la hora ha cambiado (newTimeInMs-LastPublishedTimeInMs>=1000) antes de decirle a textview que se actualice.
  4. en lugar de String.formato , intente usar StringBuilder . sin embargo, no disfrutará de la solución de configuración regional esa es la Cuerda.el formato da (por ejemplo, para dígitos árabes).
 1
Author: android developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-29 19:24:45

En mi caso fue esta propiedad de TextView:

android:ellipsize="marquee"

Eliminarlo aceleró la configuración del texto.

 0
Author: vinga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-16 13:23:42