27
2013
12

JavaFX中UI线程冲突问题

与Android一样,JavaFX也不允许在UI线程之外对高级界面进行更新,比如网络线程返回了数据,想要在界面上刷新出来,如果在网络线程里直接处理就可能抛出异常。Android可以通过Handler发送Message实现像通知UI线程,保证线程安全,JavaFX也有类似的方法。

1).javafx.concerrent.Worker接口,主要提供了Task和Service两个类,用来建立能与UI线程安全通信的线程。Task和Service区别不大,Service提供了一些重置、重启之类的方法,可以理解成Task是执行一次性的任务,Service提供服务。示例:

            Task<Void> updateNotificationTask = new Task<Void>()

            {

                @Override

                protected Void call() throws Exception

                {

                    notificationTextField.setText("hello");

                    return null;

                }

            };

            new Thread(updateNotificationTask).start();


2).Platform.runLater,推荐方法,简单、有效。该方法会在JavaFX程序线程中某个时刻安全地执行指定的线程。之前试过用Task无法在其它线程中建立Stage,而这个方法可以。示例:

            Platform.runLater(new Runnable()

            {

                

                @Override

                public void run()

                {

                    final Stage stage = new Stage();

                    Group rootGroup = new Group();

                    Scene scene = new Scene(rootGroup, 200, 200, Color.WHITESMOKE);

                    stage.setScene(scene);

                    stage.centerOnScreen();

                    stage.show();

                    Text text = new Text(20, 110, "hello");

                    rootGroup.getChildren().add(text); 

                }

            });


« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。