1

JavaFxのAPIのTaskクラスを使用してネットワーク操作を実行しています。このクラスは、この状況に完全に適合しているように見える進行状況システムを提供し、たとえば、呼び出し元のスレッドにアップロードされたファイルの量を報告できるようにします。このために、ファイルが正常にアップロードされるたびにupdateMessage(x + "files uploaded")を呼び出します。

問題は、すべてのファイルがアップロードされたときに、私が今までに受け取った唯一のメッセージが最後のメッセージであるということです。この現象は、Javadocによって何らかの形で説明されていると思います。

updateMessageの呼び出しは、後でFXアプリケーションスレッドで合体して実行されるため、FXアプリケーションスレッドからでもupdateMessageを呼び出すと、必ずしもこのプロパティがすぐに更新されるとは限りません。また、中間メッセージ値を合体して、イベント通知を節約できます。

すべてのメッセージ、または少なくとも一部のメッセージを正しく報告するにはどうすればよいですか?その周りにThread.sleep(20)を追加しようとしましたが、機能しません。何か案が?

4

2 に答える 2

3

ほとんどの場合、イベントスレッドでタスクを実行しているため、更新がブロックされます。Taskは少し誤解を招くRunnableを実装していますが、javadocを調べると、Taskを実行する正しい方法が新しいスレッドにそれを割り当てていることがわかります。new Thread(task).start();

次の例を参照してください。

public class TaskTask extends Application {
    public static void main(String[] args) { launch(args); }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle(VersionInfo.getRuntimeVersion());
        Button btn = new Button();

        final Task<Integer> task = new Task<Integer>() {
            @Override
            protected Integer call() throws Exception {
                int iterations;
                for (iterations = 0; iterations < 100; iterations++) {
                    if (isCancelled()) {
                        break;
                    }
                    Thread.sleep(100); // imitate activity
                    updateMessage("Iteration " + iterations);
                }
                return iterations;
            }
        };

        // here we monitor task updates
        btn.textProperty().bind(task.messageProperty());

        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                //here it goes
                new Thread(task).start();
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();

    }
}
于 2012-06-27T12:45:58.020 に答える
1

了解しました。私のせいです。メッセージの更新を誤ってリッスンしていました。messagePropertyでChangeListenerの代わりに、タスクでEventHandlerを使用しました。javadocは更新を送信する方法のみを示しており、更新を受信しないので、それを試しましたが、Sergeyの答えはそれを行う正しい方法です。

于 2012-06-27T13:53:39.523 に答える