Utilizzare Platform.runLater(...)
per operazioni rapide e semplici e Task
per operazioni complesse e di grandi dimensioni.
Esempio: perché non possiamo usarlo Platform.runLater(...)
per calcoli lunghi (preso dal riferimento sotto).
Problema: thread in background che conta da 0 a 1 milione e aggiorna la barra di avanzamento nell'interfaccia utente.
Codice utilizzando 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();
Questo è un orribile pezzo di codice, un crimine contro la natura (e la programmazione in generale). Innanzitutto, perderai cellule cerebrali solo guardando questo doppio annidamento di Runnables. In secondo luogo, riempirà la coda degli eventi con piccoli Runnable - un milione in effetti. Chiaramente, avevamo bisogno di alcune API per semplificare la scrittura di worker in background che poi comunicano di nuovo con l'interfaccia utente.
Codice utilizzando attività:
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();
non soffre di nessuno dei difetti mostrati nel codice precedente
Riferimento:
thread di lavoro in JavaFX 2.0