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

Trabalho em background

Esta página consolida o padrão de threading que aparece em todas as anteriores, do ponto de vista de quem escreve o trabalho pesado. O “porquê” está em A paint thread.

O template canônico

new Thread(() -> {
   var resultado = trabalhoPesado();        // I/O ou CPU — NUNCA na paint thread
   meuComponente.onUI(() -> {               // reentra na paint thread
      mostrar(resultado);                    // tocar a UI só aqui
      Component.repaint();
   });
}).start();

Formas de reentrar na UI:

Chamada Uso
Component.onUI(Runnable) de qualquer thread, a partir de um componente
Main.runOnPaintThread(Runnable) idem, fora do contexto de um componente
Main.runOnPaintThreadAndWait(Runnable) idem, bloqueando até terminar

Reagir a um evento de UI numa thread

Quando o handler de um componente deve rodar trabalho pesado, use onActionThread (roda fora da paint thread) e reentre com onUI:

botao.onActionThread(c -> {
   var dados = baixar();                    // fora da paint thread
   c.onUI(() -> lista.setItems(dados));     // volta à UI
});

Timers

Para trabalho periódico (polling, watchdog), use os timers do framework:

comp.addTimer(1000);   // dispara um evento de timer a cada 1000 ms (tratado no componente)

Utilitários de util

  • ThreadSync — barreira de 2 threads (produtor/consumidor): start()/start(maxMillis), finished(resultado), getResult(). Útil para esperar um resultado de outra thread com timeout.
  • RunnableWith<T> — callback com argumento: void run(T obj). É o tipo dos callbacks que entregam um valor (ex.: onError do GPSThread).
ThreadSync sync = new ThreadSync();
new Thread(() -> { var r = calcular(); sync.finished(r); }).start();
sync.start(5000);                 // espera até 5 s
Object r = sync.getResult();

Boas práticas

  • Todo I/O bloqueante (DB, HTTP, GPS, BLE) roda fora da paint thread.
  • Toque a UI somente dentro de onUI(...)/runOnPaintThread(...).
  • Pare threads/timers ao sair da tela (em onRemove()), senão vazam.

Erros comuns

  • Tocar widgets a partir de uma Thread sem onUI(...) → comportamento errático/travamento.
  • runOnPaintThreadAndWait(...) chamado de dentro da paint thread (deadlock) — use a variante não-bloqueante lá.
  • Timers/threads não cancelados ao trocar de tela.

Veja também

Esta página foi útil?