Use Platform.runLater(...)
para operações rápidas e simples e Task
para operações complexas e grandes.
Exemplo: Por que não podemos usar Platform.runLater(...)
para cálculos longos (retirado da referência abaixo).
Problema: thread em segundo plano que conta apenas de 0 a 1 milhão e atualiza a barra de progresso na IU.
Código usando Platform.runLater(...)
:
final ProgressBar bar = new ProgressBar();
new Thread(new Runnable() {
@Override public void run() {
for (int i = 1; i <= 1000000; i++) {
final int counter = i;
Platform.runLater(new Runnable() {
@Override public void run() {
bar.setProgress(counter / 1000000.0);
}
});
}
}).start();
Este é um pedaço de código horrível, um crime contra a natureza (e a programação em geral). Primeiro, você perderá células cerebrais apenas olhando para este aninhamento duplo de Runnables. Em segundo lugar, vai inundar a fila de eventos com pequenos Runnables - um milhão deles na verdade. Claramente, precisávamos de alguma API para tornar mais fácil escrever workers em segundo plano que então se comunicam de volta com a UI.
Código usando tarefa:
Task task = new Task<Void>() {
@Override public Void call() {
static final int max = 1000000;
for (int i = 1; i <= max; i++) {
updateProgress(i, max);
}
return null;
}
};
ProgressBar bar = new ProgressBar();
bar.progressProperty().bind(task.progressProperty());
new Thread(task).start();
não sofre de nenhuma das falhas exibidas no código anterior
Referência:
Worker Threading em JavaFX 2.0