Ah, enhebrar. 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
, la creación de subprocesos es 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 un montón de
operaciones que solo se ejecutan en el subproceso 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 subproceso principal. Ahora, si recuerda, el trabajo que se
ejecuta en el subproceso principal llega allí después de ser extraído
del frente de una cola de trabajo, por lo que los bloques de trabajo
se realizan en orden y el siguiente bloque de
trabajo no se procesa hasta que el actual
es completado, lo que significa que si hay una gran
cantidad de trabajo entre un evento de entrada y su
devolución de llamada, el usuario tendrá que esperar más
de lo esperado para ver los resultados.
Y no olvide que
el hilo principal también es 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 fluidos. El problema es que
esto sucede mientras el subproceso también
responde a los eventos de entrada de la aplicación. Por lo tanto, si su aplicación está en
medio de una animación y algún paquete de trabajo aleatorio
tarda más de lo esperado, perderá la oportunidad
de renderizar el siguiente cuadro dentro de la
ventana de 16 milisegundos y ese cuadro se retrasará. Esto es lo que llamamos un
marco caído, y cuando esto sucede, los usuarios comienzan 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 a realizar, y
no interrumpirá el dibujo de la pantalla, que
es el objetivo principal de subprocesos en Android en pocas palabras.
Entonces, la pregunta en cuestión, ¿
cuál es la mejor manera de descargar este trabajo y cómo
elige qué tipos de trabajo descargar? Afortunadamente, el
marco de trabajo de Android ha proporcionado un
puñado de clases para ayudarlo a que esto sea un
poco más fácil para usted. Por ejemplo, la
clase AsyncTask es ideal para ayudarlo a que el
trabajo dentro y fuera del subproceso de la interfaz de usuario sea el correcto.
Los HandlerThreads
son excelentes cuando necesita un subproceso dedicado
para que aterricen las devoluciones de llamada. ThreadPools funciona mejor cuando
puede dividir su trabajo en paquetes realmente pequeños
y luego arrojarlos a un montón de
subprocesos, y IntentServices es realmente ideal para
tareas en segundo plano, o cuando necesita obtener el
trabajo de intención del subproceso de la interfaz de usuario. Y como todo lo demás,
aquí no hay una bala de plata, pero saber qué
primitivo es mejor para qué situación puede
ahorrarle muchos dolores de cabeza. Pero tenga en cuenta que tener todas
esas clases de ayuda sofisticadas no oculta el
gran problema, la memoria. Mira, el subprocesamiento y la memoria
nunca han funcionado bien, y en la
plataforma Android no es diferente. Por ejemplo, si declara
uno de esos primitivos de subprocesos sofisticados 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 bien, ¿qué sucede cuando el
usuario rota el dispositivo, destruyendo una
actividad que generó un montón de trabajo subproceso? Quiero decir, es probable
que esos paquetes de trabajo tengan referencias
a varios objetos de la interfaz de usuario que en realidad ya no existen. Y lo cierto 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 geniales que suceden debajo del capó
que nunca supo . Mira, al final
del día, el subprocesamiento es fundamental 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 del rendimiento de Android.
Vídeos de patrones. Y también, no olvides unirte a
nuestra comunidad de Google+ para que puedas hacer preguntas cuando
tengas problemas. Así que mantén la calma, crea un perfil de tu
código y recuerda siempre que el rendimiento importa. [MÚSICA].