Pular para o conteúdo
CrossFly é 100% open sourceSiga no GitHub
CrossFlyCrossFly
Começar

A paint thread

Esta é, provavelmente, a regra mais importante do framework para não corromper seu app.

O CrossFly é single-thread na paint thread

Toda operação de UI e de renderização acontece em uma única thread — a paint thread. O Main chama create(), render() e resize() sempre nela; todo onShow, onPaint, onLayout, callback de toque e mudança de componente roda nela.

Por quê essa decisão? Simplicidade e correção. Com um único fio de execução tocando a UI, não há locks, nem estado compartilhado disputado no caminho de pintura. O preço é uma regra que você precisa respeitar: nunca toque na UI de outra thread.

O padrão canônico: trabalho pesado fora, UI de volta com onUI

Rede, banco, arquivo, cálculo longo → thread de fundo. Para tocar na UI com o resultado, volte para a paint thread com Component.onUI(...):

new Thread(() -> {
   List<Cliente> dados = repositorio.buscarTudo();   // trabalho pesado, thread de fundo
   Component.onUI(() -> {                             // volta para a paint thread
      lista.setItems(dados);                          // agora é seguro mexer na UI
      Component.repaint();                             // pede um novo frame
   });
}).start();

Existe também Main.runOnPaintThread(Runnable) (e a variante runOnPaintThreadAndWait(...)) para o mesmo fim fora do contexto de um Component.

Sintoma clássico de violar a regra: o app trava ou se comporta de forma errática ao “atualizar a tela” de dentro de um callback de rede/timer. A correção é sempre envelopar o toque na UI com onUI(...).

Render sob demanda

A paint thread não fica redesenhando continuamente. Um novo frame só é gerado quando alguém chama repaint() (internamente Gdx.graphics.requestRendering()). Isso economiza bateria — uma tela parada não gasta GPU.

A maioria dos setters de componente já chama repaint() por você. As consequências a lembrar:

  • Mudou algo que o framework não conhece? Chame repaint() você mesmo.
  • Animação? Ela precisa manter o pedido de render vivo a cada frame (é o que os animadores fazem no onUpdate; ver Animações de valor).

onUI

repaint

thread de fundo
(rede/DB/cálculo)

paint thread

requestRendering

próximo frame
(pinta a árvore)

Veja também

Esta página foi útil?