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

O ciclo de vida

O ciclo de vida do CrossFly tem três níveis: a aplicação, a janela (tela) e o componente.

Nível 1 — aplicação: o bootstrap (Main)

Main é o ApplicationListener da libGDX. Quando a plataforma sobe, a libGDX chama Main.create() na paint thread, e o Main:

  1. detecta a plataforma e inicializa o runtime e a configuração de dispositivo;
  2. resolve o nome da janela principal (de um argumento classname ou de getMainWindow());
  3. instancia essa janela por reflexão (Class.forName(...) → newInstance()) e chama seu onShow().

Depois disso, a libGDX chama render() (a cada frame renderizado) e resize() — sempre na paint thread.

Nível 2 — janela: onShow()

Cada tela é uma subclasse de Window que monta sua UI em onShow() (com super.onShow()):

public class TelaHome extends Window {
   @Override public void onShow() throws Exception {
      super.onShow();
      setLayout(new VerticalLayout());
      add(LAY_AUTO, new Label("Início"));
   }
}

Por que onShow() e não o construtor? No construtor, os bounds e a hierarquia ainda não estão prontos — Screen.width/height e o tamanho da janela só são válidos depois. Montar a UI cedo demais leva a medidas erradas. (A pilha de janelas e navegação estão em A pilha de janelas.)

Nível 3 — componente: onAdd(firstTime) / onRemove()

Quando um componente entra na árvore, o framework chama onAdd(boolean firstTime); quando sai, onRemove(). É aí que você inicializa e libera recursos:

public class Relogio extends Component {
   private Timer timer;
   @Override public void onAdd(boolean firstTime) throws Exception {
      super.onAdd(firstTime);
      if (firstTime) timer = iniciarTimer();   // recursos que devem existir uma vez só
   }
   @Override public void onRemove() {
      if (timer != null) timer.cancel();        // sempre libere ao sair
      super.onRemove();
   }
}

O que firstTime distingue? Um componente pode ser adicionado, removido e readicionado. firstTime == true só na primeira vez — use-o para setup que não deve repetir. onRemove() é o par de limpeza: cancele timers, listeners, cursores.

Regra geral: não inicialize UI/recursos no construtor. Use onShow() (janela) e onAdd(firstTime) (componente), onde bounds e hierarquia já são válidos.

Main.create() (paint thread)

instancia MainWindow por reflexão

Window.onShow() — monta a UI

Component.onAdd(firstTime) — por filho

vivo: onLayout / onPaint / eventos

Component.onRemove() — libera recursos

Veja também

Esta página foi útil?