Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.
La paint thread
Esta es, probablemente, la regla más importante del framework para no corromper tu app.
CrossFly es single-thread en la paint thread
Toda operación de UI y de renderizado ocurre en una única thread — la paint thread. El Main
llama a create(), render() y resize() siempre en ella; todo onShow, onPaint, onLayout, callback de
toque y cambio de componente se ejecuta en ella.
¿Por qué esta decisión? Simplicidad y corrección. Con un único hilo de ejecución tocando la UI, no hay locks, ni estado compartido en disputa en el camino de pintura. El precio es una regla que debes respetar: nunca toques la UI desde otra thread.
El patrón canónico: trabajo pesado fuera, UI de vuelta con onUI
Red, base de datos, archivo, cálculo largo → thread de fondo. Para tocar la UI con el resultado, vuelve
a la paint thread con Component.onUI(...):
new Thread(() -> {
List<Cliente> dados = repositorio.buscarTudo(); // trabajo pesado, thread de fondo
Component.onUI(() -> { // vuelve a la paint thread
lista.setItems(dados); // ahora es seguro tocar la UI
Component.repaint(); // pide un nuevo frame
});
}).start();
También existe Main.runOnPaintThread(Runnable) (y la variante runOnPaintThreadAndWait(...)) para el
mismo fin fuera del contexto de un Component.
Síntoma clásico de violar la regla: la app se cuelga o se comporta de forma errática al “actualizar la pantalla” desde dentro de un callback de red/timer. La corrección es siempre envolver el toque a la UI con
onUI(...).
Render bajo demanda
La paint thread no se pasa redibujando continuamente. Un nuevo frame solo se genera cuando alguien llama a
repaint() (internamente Gdx.graphics.requestRendering()). Esto ahorra batería — una pantalla
quieta no gasta GPU.
La mayoría de los setters de componente ya llaman a repaint() por ti. Las consecuencias a recordar:
- ¿Cambiaste algo que el framework no conoce? Llama a
repaint()tú mismo. - ¿Animación? Necesita mantener viva la solicitud de render en cada frame (es lo que hacen los animadores
en el
onUpdate; ver Animaciones de valor).
Ver también
- Relacionado: El pipeline de renderizado · Estado y flujo de datos
- Siguiente: Layout y el modelo Relative