2014-07-26 278 views
0

我想從數據庫中獲取JavaFX應用程序中的數據。但在此期間,應用程序凍結。從數據庫中獲取數據

Map<String, List<DataObj>> dbData = ConnectedAgents.generateDataObj(ac); 

我測試了這段代碼,首先看它看起來不錯。但是,這是做背景數據庫操作的野獸嗎?

Platform.runLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       Map<String, List<DataObj>> dbData = ConnectedAgents.generateDataObj(ac); 
      } 
     }); 

您能告訴我什麼是在JavaFX中執行數據庫操作的最佳方法?

回答

2

Platform.runLater(...)不在後臺線程中運行。它實際上完全相反:它在FX應用程序線程上執行提供的Runnablerun()方法。您可以使用Platform.runLater(...)作爲在後臺線程上運行的代碼的結果來更新UI,但通常有更好的方法來執行此操作。

你應該使用Task來達到你想要的。

final Task<Map<String, List<DataObj>>> dataGenerationTask = new Task<Map<String, List<DataObj>>>() { 
    @Override 
    public Map<String, List<DataObj>> call() throws Exception { 
     return ConnectedAgents.generateDataObj(ac); 
    } 
}; 

dataGenerationTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
    @Override 
    public void handle(WorkerStateEvent event) { 
     Map<String, List<DataObj>> dbData = dataGenerationTask.getValue(); 
     // you can safely update the UI with the dbData here.... 
    } 
}); 

dataGenerationTask.setOnFailed(new EventHandler<WorkerStateEvent>() { 
    @Override 
    public void handle(WorkerStateEvent event) { 
     Throwable t = dataGenerationTask.getException(); 
     // handle errors here, if needed 
    } 
}); 

Thread thread = new Thread(dataGenerationTask); 
thread.setDaemon(true); // this thread won't prevent shutdown of the application 
thread.start(); 
+0

一般來說,當任務完成後會發生什麼?它是被摧毀還是處於睡眠狀態? –

+0

它將移動到「成功」狀態(或「失敗」狀態,如果它完成但有例外)。這是一個一次性的任務,所以你不能重新啓動它。顯然,只要你讓它超出範圍,它就會以通常的方式收集垃圾。 –