Używaj Platform.runLater(...)
do szybkich i prostych operacji oraz Task
do złożonych i dużych operacji.
Przykład: Dlaczego nie możemy używać Platform.runLater(...)
do długich obliczeń (wzięte z poniższego odniesienia).
Problem: Wątek w tle, który liczy od 0 do 1 miliona i aktualizuje pasek postępu w interfejsie użytkownika.
Kod przy użyciu 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();
To ohydny kawałek kodu, zbrodnia przeciwko naturze (i ogólnie programowaniu). Po pierwsze, stracisz komórki mózgowe, patrząc na podwójne zagnieżdżenie Runnables. Po drugie, kolejka wydarzeń zostanie zalana małymi Runnables - w rzeczywistości milionem z nich. Oczywiście potrzebowaliśmy interfejsu API, aby ułatwić pisanie procesów roboczych w tle, które następnie komunikują się z interfejsem użytkownika.
Kod przy użyciu zadania:
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();
nie ma żadnych wad ujawnionych w poprzednim kodzie
Odniesienie:
wątki robocze w JavaFX 2.0