将进度侦听器附加到列表中的对象的正确方法

时间:2016-04-16 15:48:40

标签: java javafx

我正在制作一个允许用户远程解决问题的JavaFX桌面应用程序。它将文件下载到云存储并从那里上传结果(这看起来有点奇怪,但现在不是这样)。

我有一个代表问题的类(Model)和一个Controller类,它定期访问云。我借助云存储API中的ProgressListener类跟踪下载/上传每个问题的进度。我为列表中的每个问题都需要一个单独的实例(以便它们可以同时下载),因此我在Problem类中为进度监听器创建了一个实例变量。问题是,在每次下载/上传结束时,我需要执行一些操作(比如与云存储交谈),并在问题类中编写所有这些代码(或者甚至调用Controller方法),而不是# 39;对我来说似乎是个好主意。

问题类看起来像这样:

public class Problem {
    private SimpleIntegerProperty progress;
    private ProgressListener progressListener;
    public Problem() {
        progressListener = new ProgressListener() {
            @Override
            public void updateProgress(int bytes,int total) {
                progress.set(bytes);
                if (bytes==total) {
                    // do smth in cloud storage
                }
            }
        }
    }
}

我的问题是如何正确实施这种互动。

1 个答案:

答案 0 :(得分:0)

我认为控制器类是跟踪下载进度的自然场所。 所以我会创建进度监听器:

public class Controller {

    public ProgressListener createProgressListener(Problem problem, Consumer<Problem> onDownloadComplete) {

        return new ProgressListener() {

            @Override
            public void updateProgress(int bytes, int total) {
                if (bytes == total) {
                    onDownloadComplete.accept(problem);
                }
            }
        };
    }
}