您的位置:首页 > 编程语言 > Java开发

JavaFX之Task的使用

2015-12-14 10:49 351 查看
任何做过GUI开发的人都会碰到在非UI线程中进行UI上的更新操作出现的问题。

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

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

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

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

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

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

  

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

  

[java] view
plaincopy

public class taskexample extends Application {  

  

      

    public void init(Stage primaryStage){  

        Region veil = new Region();  

        veil.setStyle("-fx-background-color: rgba(0, 0, 0, 0.4)");  

          

        HBox mHbox = new HBox(10);  

        ProgressIndicator mBar = new ProgressIndicator(0);  

        mBar.setMaxSize(150, 150);  

        Label mLabel = new Label("Loading...0%");  

        mLabel.setFont(new Font(10));  

        mHbox.getChildren().add(mBar);  

        mHbox.getChildren().add(mLabel);  

          

        Task<Void> progressTask = new Task<Void>(){  

  

            @Override  

            protected void succeeded() {  

                super.succeeded();   

                updateMessage("Succeeded");  

            }  

  

            @Override  

            protected void cancelled() {  

                super.cancelled();   

                updateMessage("Cancelled");  

            }  

  

            @Override  

            protected void failed() {  

                super.failed();   

                updateMessage("Failed");  

            }  

  

            @Override  

            protected Void call() throws Exception {  

                for(int i = 0; i < 100; i++){  

                    Thread.sleep(50);  

                    updateProgress(i + 1, 100);  

                    updateMessage("Loading..." + (i + 1) + "%");  

                }  

                updateMessage("Finish");  

                return null;  

            }  

      };  

          

        StackPane root = new StackPane();  

        root.getChildren().addAll(veil, mBar, mLabel);  

        Scene scene = new Scene(root, 300, 250);  

        veil.visibleProperty().bind(progressTask.runningProperty());  

        mBar.progressProperty().bind(progressTask.progressProperty());  

        mLabel.textProperty().bind(progressTask.messageProperty());  

          

        primaryStage.setTitle("The lesson of Task");  

        primaryStage.setScene(scene);  

          

        new Thread(progressTask).start();  

    }  

      

      

      

    @Override  

    public void start(Stage primaryStage) {  

        init(primaryStage);  

        primaryStage.show();  

    }        

  

    public static void main(String[] args) {  

        launch(args);  

    }  

}  

   上面是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),我自己也使用过,有时间再写写相关的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: