JavaFX之Task的使用

任何做过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/


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),我自己也使用过,有时间再写写相关的情况。


转载请注明出处:http://blog.csdn.net/ml3947

-------------------------------------------------------------------------------------------------

好久没有写博客了,可能是工作上和感情上的一些问题,从9月份开始后的几个月都没怎么动博客。

最近一切都走上正轨,所以又开始写写博客。

希望大家工作顺利。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值