Threading Performance 101. (Android Performance Patterns Season 5, Ep. 1)

Ah, enhebrando. Tan poderoso que puedes
plegar genomas con él, pero tan difícil
que puede volver loco al programador promedio. Mi nombre es Cole
McCandless, y en lo que respecta al desarrollo de Android
, los subprocesos son una de las cosas más
importantes y confusas con las que puedes
lidiar, lo que significa que si quieres escribir
la aplicación más rápida posible, debes tomar un minuto y
comprender el arte sutil que es la programación multiproceso. Recuerde que en el vasto
mundo de las funciones de Android hay una gran cantidad de
operaciones que solo se ejecutan en el hilo principal:
eventos del sistema, eventos de entrada, servicios de devolución de llamadas de aplicaciones
e incluso alarmas.

Y en su mayor parte,
cualquier código que escriba se ejecuta dentro de una de estas
operaciones, lo que significa que también se ejecuta en el hilo principal. Ahora, si recuerda, el trabajo que
se ejecuta en el hilo principal llega allí después de ser retirado
del frente de una cola de trabajos, por lo que los bloques de trabajo
se realizan en orden y el siguiente bloque de
trabajo no se procesa hasta que se completa el actual.
completado, lo que significa que si hay una gran
cantidad de trabajo entre un evento de entrada y su
devolución de llamada, entonces el usuario tendrá que esperar más
de lo esperado para ver los resultados.

Y no olvide que
el hilo principal es también donde ocurre la mayor parte de la
representación de la pantalla. Mientras se produce una animación o una
actualización de la pantalla, el sistema intentará
dibujar la pantalla cada 16 milisegundos aproximadamente para lograr
60 fotogramas por segundo sin problemas. El problema es que
esto sucede mientras el hilo también
responde a los eventos de entrada de la aplicación. Entonces, si su aplicación está en
medio de una animación y algún paquete de trabajo aleatorio
demora más de lo esperado, perderá la oportunidad
de renderizar el siguiente fotograma dentro de la
ventana de 16 milisegundos y ese fotograma se retrasará. Esto es lo que llamamos
fotograma caído y, cuando esto sucede, los usuarios empiezan a notarlo.

La solución directa
aquí es mover cualquier cosa que pueda alterar la
ventana de 16 milisegundos a otro lugar, como
a un hilo diferente. De esta manera, no competirá
con el subproceso de la interfaz de usuario por el trabajo por realizar y
no interrumpirá el dibujo de la pantalla, que
es, en pocas palabras, el objetivo del subproceso en Android. Entonces, la pregunta que nos ocupa es: ¿
cuál es la mejor manera de descargar este trabajo y cómo
se elige qué tipos de trabajo descargar? Afortunadamente, el
marco de trabajo de Android ha proporcionado un
puñado de clases para ayudarte a que esto te resulte un
poco más fácil. Por ejemplo, la
clase AsyncTask es ideal para ayudarle a
trabajar dentro y fuera del subproceso de la interfaz de usuario de la manera correcta. HandlerThreads
son excelentes cuando necesitas un hilo dedicado
al que llegar las devoluciones de llamada. ThreadPools funciona mejor cuando
puedes dividir tu trabajo en paquetes realmente pequeños
y luego lanzarlos a un montón de
subprocesos, y IntentServices son realmente ideales para
tareas en segundo plano o cuando necesitas sacar el
trabajo de intención del subproceso de la interfaz de usuario.

Y como todo lo demás,
aquí no existe una solución milagrosa, pero saber qué
primitiva es mejor para cada situación puede
ahorrarte muchos dolores de cabeza. Pero tenga en cuenta que tener todas
esas sofisticadas clases de ayuda no oculta el
gran problema: la memoria. Mira, los subprocesos y la memoria
nunca han funcionado bien, y en la
plataforma Android no es diferente. Por ejemplo, si declaras
una de esas elegantes primitivas de subprocesamiento dentro
de una actividad, ahora contiene una
referencia implícita a la actividad externa,
lo que puede causar una pérdida de memoria si la actividad
se destruye, pero el
trabajo subproceso aún está vivo.

¿ O qué sucede cuando el
usuario gira el dispositivo, destruyendo una
actividad que generó una gran cantidad de trabajos encadenados? Quiero decir, es probable
que esos paquetes de trabajo tengan referencias
a varios objetos de la interfaz de usuario que realmente ya no existen. Y la verdad es que
la plataforma Android está inundada de hilos. Si necesita un recordatorio de
eso, tome una captura de Systrace y vea todas
las cosas interesantes que suceden debajo del capó y
que nunca conoció. Mira, al final
del día, los subprocesos son fundamentales para garantizar un
alto rendimiento de tu aplicación de Android, pero
hay muchos otros problemas de los que también debes preocuparte
, por lo que deberías consultar el
resto de la sección Rendimiento de Android. Vídeos de patrones. Y además, no olvides unirte a
nuestra comunidad de Google+ para que puedas hacer preguntas cuando
tengas problemas. Así que mantenga la calma, perfile su
código y recuerde siempre que el rendimiento importa.

[MÚSICA].

As found on YouTube