Поскольку вам необходимо выполнять периодическую задачу background , которая связывается с Потоком приложений JavaFX , было бы лучше использовать ScheduledService
. Этот класс периодически выполняет (новый) Task
, используя Executor
, который может быть определен разработчиком. Обратите внимание, что ScheduledService
расширяет javafx.concurrent.Service
.
Вот скелетный пример того, что вам нужно сделать, чтобы реализовать это:
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.concurrent.ScheduledService;
import javafx.concurrent.Task;
public class ConnectionStatusService extends ScheduledService<Status> {
// Property allows you to change the "baseUrl" between executions
private final StringProperty baseUrl = new SimpleStringProperty(this, "baseUrl");
// property getter and setters omitted...
@Override
protected Task<Status> createTask() {
// creates a new Task and gives the current "baseUrl"
// as an argument. This is called every cycle
return new ConnectionStatusTask(getBaseUrl());
}
private static class ConnectionStatusTask extends Task<Status> {
// A Task is a one-shot thing and its initial state should be
// immutable (or at least encapsulated from external modification).
private final String baseUrl;
private ConnectionStatusTask(String baseUrl) {
this.baseUrl = baseUrl;
}
@Override
protected Status call() throws Exception {
// Do what you need to determine connection status
return computedStatus;
}
}
}
Тогда вы будете слушать / связывать свойство lastValue
.
public void initService() {
ConnectionStatusService service = new ConnectionStatusService();
service.setBaseUrl(/* your URL */);
service.setPeriod(Duration.seconds(1)); // run every 1 seconds
service.lastValueProperty().addListener(/* your listener */); // or bind to this property
// you may also want to add EventHandlers/Listeners to handle when the
// service fails and such.
service.start();
}
Важно, что вы соблюдаете свойство lastValue
, а не свойство value
. Причина указана в Javadoc lastValue
:
Последнее успешно вычисленное значение. Во время каждой итерации
«значение» ScheduledService будет сброшено на ноль, как и в любом
другой сервис. Однако «lastValue» будет установлено на
недавно успешно вычисленное значение, даже между итерациями. это
сбрасывайте, однако, всякий раз, когда вы вручную вызываете сброс или перезапуск.
Я рекомендую прочитать Javadoc Task
, Service
и ScheduledService
для получения дополнительной информации. Все три из этих классов реализуют интерфейс javafx.concurrent.Worker
.