JavaFX之Task的使用

任何做过GUI开发的人都会碰到在非UI线程中进行UI上的更新操作出现的问题。

  在Android开发中,可以通过AsyncTask进行线程上的操作和UI的更新,不过通常AsyncTask的终止和再启动有问

题,我们通常使用Thread和Handler来自己实现相关的功能。

  而在Swing开发中,我们可以使用SwingUtilities.invokeLater和SwingUtilities.invokeAndWait来做处理,也可以

使用SwingWorker来进行线程上的操作和UI更新。

  这个SwingWorker和Android中的AsyncTask也类似,实现了相同的功能。


  在JavaFX中,为了解决这样的问题,提供了Task和Service,不过使用Thread包装Task进行启动和使用Service与Task启动没有什么太大的区别。不过Service提供了restart等方法,这样可以很方便的进行refresh等操作。

  

  示例地址:http://www.wingmei.net/examples/exp2/


  

[java]  view plain copy
  1. public class taskexample extends Application {  
  2.   
  3.       
  4.     public void init(Stage primaryStage){  
  5.         Region veil = new Region();  
  6.         veil.setStyle("-fx-background-color: rgba(0, 0, 0, 0.4)");  
  7.           
  8.         HBox mHbox = new HBox(10);  
  9.         ProgressIndicator mBar = new ProgressIndicator(0);  
  10.         mBar.setMaxSize(150150);  
  11.         Label mLabel = new Label("Loading...0%");  
  12.         mLabel.setFont(new Font(10));  
  13.         mHbox.getChildren().add(mBar);  
  14.         mHbox.getChildren().add(mLabel);  
  15.           
  16.         Task progressTask = new Task(){  
  17.   
  18.             @Override  
  19.             protected void succeeded() {  
  20.                 super.succeeded();   
  21.                 updateMessage("Succeeded");  
  22.             }  
  23.   
  24.             @Override  
  25.             protected void cancelled() {  
  26.                 super.cancelled();   
  27.                 updateMessage("Cancelled");  
  28.             }  
  29.   
  30.             @Override  
  31.             protected void failed() {  
  32.                 super.failed();   
  33.                 updateMessage("Failed");  
  34.             }  
  35.   
  36.             @Override  
  37.             protected Void call() throws Exception {  
  38.                 for(int i = 0; i < 100; i++){  
  39.                     Thread.sleep(50);  
  40.                     updateProgress(i + 1100);  
  41.                     updateMessage("Loading..." + (i + 1) + "%");  
  42.                 }  
  43.                 updateMessage("Finish");  
  44.                 return null;  
  45.             }  
  46.       };  
  47.           
  48.         StackPane root = new StackPane();  
  49.         root.getChildren().addAll(veil, mBar, mLabel);  
  50.         Scene scene = new Scene(root, 300250);  
  51.         veil.visibleProperty().bind(progressTask.runningProperty());  
  52.         mBar.progressProperty().bind(progressTask.progressProperty());  
  53.         mLabel.textProperty().bind(progressTask.messageProperty());  
  54.           
  55.         primaryStage.setTitle("The lesson of Task");  
  56.         primaryStage.setScene(scene);  
  57.           
  58.         new Thread(progressTask).start();  
  59.     }  
  60.       
  61.       
  62.       
  63.     @Override  
  64.     public void start(Stage primaryStage) {  
  65.         init(primaryStage);  
  66.         primaryStage.show();  
  67.     }        
  68.   
  69.     public static void main(String[] args) {  
  70.         launch(args);  
  71.     }  
  72. }  

   上面是Task的使用示例。

   Region只是一个灰度蒙版,visible属性与Task的running属性绑定,Task执行结束的时候,蒙版Region也消失。

   通过创建一个Task,然后在Task的call方法中进行耗时操作的处理。我们可以通过updateProgress和updateMessage进行更新progress和message属性。

   进行UI更新的最简单的方式就是将UI控件的属性与Task的各种属性进行绑定,这样在Task进行任务的时候可以同步更新UI。


  当然,我们也可以自行的覆盖updateProgress和updateMessage等方法,进行自定义的操作。这样就和使用android中的AsyncTask是一样的。


  另外,JavaFX中提供了一个将JavaFX打包为本地安装文件的工具(支持Windows,Linux和Mac),我自己也使用过,有时间再写写相关的情况。


你可能感兴趣的:(java)