Saltar al contenido
CrossFly es 100% open sourceSíguenos en GitHub
CrossFlyCrossFly
Empezar

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

onUI

repaint

hilo de fondo
(red/DB/cálculo)

paint thread

requestRendering

siguiente frame
(pinta el árbol)

Ver también

¿Te resultó útil esta página?