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.:onErrordoGPSThread).
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
ThreadsemonUI(...)→ 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
- Conceito: A paint thread
- Gerência de estado · Rede e HTTP
Esta página foi útil?Obrigado pelo feedback!