2017-03-06 67 views
0

我使用JavaFX工作同步和我解析一个相当大的文件。与UI线程

我在处理解析一类这样做,和我创建一个新的线程来做到这一点因此,尽管进展不锁定的用户界面。

这里是我的代码片段:

Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 

     try 
     { 
      // ... Do parsing in here 
     } 
     catch(Exception ex) 
     { 
      // ... Show Exception 
     } 
     } 
    }); 

    thread.start(); 

我的UI是依赖于正被解析(它显示在UI)的数据。

反正我有可以syncronize这个线程和UI线程,这样的UI更新的文件被解析?

+1

'Task.updateValue'万一单个对象有足够的信息来更新UI。否则'Platform.runLater' ... – fabian

+0

我试过Platform.runLater,但它似乎没有更新UI。 –

+0

@timbobaggins如果您的代码无法按照您的方式工作,并且您需要帮助,请在该问题中包含该代码。 –

回答

0

你可以做这样的事情。

final int size = //determine the size of the file; 
     Service<Void> service = new Service<Void>() { 
      @Override 
      protected Task<Void> createTask() { 
       return new Task<Void>() { 
        @Override 
        protected Void call() throws Exception { 
         loop while parsing... { 
          Platform.runLater(() -> updateProgress(getWorkDone() + 1, size)); 

         } 
         return null; 
        } 
       }; 
      } 
     }; 

     service.setOnFailed(event -> //error handling); 
     progressIndicator.visibleProperty().bind(service.runningProperty()); 
     progressIndicator.progressProperty().bind(service.progressProperty()); 
     service.start(); 
+0

您不需要在应用程序线程上执行'updateProgress'。在'progress'属性的修改是在应用程序线程自动完成... – fabian

+0

@fabian没有runLater()FX抱怨,任务不允许在FX主题进行更新。这很奇怪。稍后添加运行修复了编译问题。 –

+0

看看的Javadoc:https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html#updateProgress-long-long-它包含以下句子:*“这种方法可以安全地从任何线程调用。“*。此外,这肯定不是你使用'javac'得到的编译错误... – fabian