Gunakan Platform.runLater(...)
untuk operasi cepat dan sederhana dan Task
untuk operasi kompleks dan besar.
Contoh: Mengapa tidak bisa kita gunakan Platform.runLater(...)
untuk perhitungan panjang (Diambil dari referensi di bawah).
Masalah: Utas latar belakang yang hanya menghitung dari 0 hingga 1 juta dan memperbarui bilah kemajuan di UI.
Kode menggunakan 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();
Ini adalah sebongkah kode yang mengerikan, kejahatan terhadap alam (dan pemrograman secara umum). Pertama, Anda akan kehilangan sel-sel otak hanya dengan melihat sarang ganda Runnable ini. Kedua, itu akan membanjiri antrian acara dengan Runnable kecil - sejuta di antaranya sebenarnya. Jelas, kami membutuhkan beberapa API untuk mempermudah menulis pekerja latar belakang yang kemudian berkomunikasi kembali dengan UI.
Kode menggunakan Tugas:
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();
itu tidak memiliki kekurangan yang ditunjukkan pada kode sebelumnya
Referensi:
Worker Threading di JavaFX 2.0