2015-03-15 2 views
3

У меня есть одна проблема. Я создаю приложение JavaFX для рабочего стола. У меня есть поток в моем приложении, который работает в фоновом режиме, предположим, что он загружает файлы из Интернета.
Я прочитал статьи о параллелизме в JavaFX. Существует специальная задача класса. Я расширил свой класс с помощью задачи. Но он может только вернуть некоторую ценность, и после этого он будет закрыт.
Но мне нужно, чтобы эта задача выполнялась в течение всего жизненного цикла приложения, и когда, скажем, файл загружен, он должен публиковать результат в потоке пользовательского интерфейса, чтобы быть более точным на контроллере, который, в свою очередь, обновляет некоторый компонент ui.
Я знаю, что у задачи есть метод updateProgress, возможно, я могу связать ее не только для получения целых чисел, но и для сложных объектов.
Или есть другой хороший подход, чтобы следовать в моем случае.
Пожалуйста, помогите с этой проблемой.Прослушать фоновый поток от UI JavaFX

+0

Любые особые причины для * задача запускается на протяжении всего жизненного цикла приложения * и не создавать ее, когда это необходимо? – ItachiUchiha

+0

Ответ на вопрос @ ItachiUchiha зависит от того, запрашивается ли файл (или что-то, что делает фоновый поток) из пользовательского интерфейса (например, нажатие кнопки «загрузка»), и в этом случае вы могли бы создать задачу по требованию или полностью не зависит от действий пользовательского интерфейса. –

+0

Нет, файлы downloadin - это просто пример, okey, я буду hones, служба проверки почты, проходящая через всю жизнь приложения – bxfvgekd

ответ

2

JavaFX предоставляет вам ScheduledService, который может быть спланирован для повторяющихся работ. Javadoc говорит,

ScheduledService это служба, которая будет автоматически перезагружена сам после успешного выполнения, и при некоторых условиях будут рестарта даже в случае выхода из строя.

Очень простой пример был бы:

ScheduledService<Object> service = new ScheduledService<Object>() { 
    protected Task<Object> createTask() { 
     return new Task<Object>() { 
      protected Object call() { 
       // Connect to a Server 
       // Download the object 
       updateProgress(...); 
       return object; // Useful in case you want to return data, else null 
      } 
     }; 
    } 
}; 
service.setPeriod(Duration.seconds(10)); //Runs every 10 seconds 
//bind the service progress/message properties 
progressBar.progressProperty().bind(service.progressProperty()); 

Есть без JavaFX способов для достижения этой цели, а также, вы можете использовать:

+0

Работает как шарм, кстати – bxfvgekd

1

Самого простой способ здесь будет использовать обычную старую тему:

// create new thread at start, e.g. at the end for Application.start() method 
new Thread(new Runnable() { 
    public void run() { 
     while(true) { 
      //load my data 
      // once loaded 
      // update UI using 
      Platform.runLater(new Runnable() { 
       public void run() { 
        // here goes my update on FX UI thread 
       } 
      }); 
      // update is done let's look for more data 
     } 
    } 
}).start(); 
Смежные вопросы