zip提取时TextArea不会更新

时间:2017-04-10 05:46:16

标签: multithreading javafx task

我正在开发一个JavaFx应用程序,我有一个脚本提取zip,然后执行其他操作,如更新文件等。

我希望有一个textArea显示在后台进行的操作,例如" Zip提取...","更新xyz文件"等

直到现在我尝试了以下方式:

            MyTask<String> task;
                task = new MyTask<String>() {
                    @Override
                    protected String call() throws Exception {

                        File path = new File(exportTo.getAbsolutePath());
                        updateMessage("Extracting modular app to target directory...");
                        patcher.unZip(appPath.getAbsolutePath(), path.getAbsolutePath());

                        if (path.exists()) {
                            AppInfo info = getAppInfo();
                            patcher.patchAndroid(info, resourceZip, new File(path.getAbsolutePath() + "/" + appPath.getName().substring(0, appPath.getName().lastIndexOf("."))), this);
                            showOkAlert("Build completed!");
                        } else {
                            showOkAlert("Modular app folder not found");
                        }
                        return "";
                    }

                    @Override
                    protected void updateProgress(double workDone, double max) {
                        patcher.reportLogs(message);
                    }

                    private String message;

                    @Override
                    public void updateMessage(final String message) {

                        Platform.runLater(() -> patcher.reportLogs(message));

                        this.message = message;
                        //updateProgress(0, 0);
                    }
                };
                task.run();

MyTask类

abstract class MyTask<T> extends Task<T> {

    abstract public void updateMessage(String message);
}

我尝试过使用updateProgress方法,Platform.runLater()但没有任何工作。

在所有操作完成后,我将在textArea中打印所有消息。

请帮忙。

1 个答案:

答案 0 :(得分:2)

作为Task州的javadoc,您需要手动创建Thread来执行Task

     Thread th = new Thread(task);
     th.start();

目前,您的task正在Application UI线程上运行并阻止UI更新。