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:
- detecta a plataforma e inicializa o runtime e a configuração de dispositivo;
- resolve o nome da janela principal (de um argumento
classnameou degetMainWindow()); - instancia essa janela por reflexão (
Class.forName(...)→newInstance()) e chama seuonShow().
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) eonAdd(firstTime)(componente), onde bounds e hierarquia já são válidos.
Veja também
- Aplicar: Navegar entre telas
- Próximo: Estado e fluxo de dados