gpt4 book ai didi

java - 如何实现与 UI 无关的后台工作任务

转载 作者:太空宇宙 更新时间:2023-11-04 06:44:37 25 4
gpt4 key购买 nike

我正在开发一个桌面 GUI 应用程序。我目前正在使用 Swing,但我希望将来能够将其移植到 JavaFX 或 Android。

目前,我正在努力实现一个“与 UI 无关”的后台任务类:目标是能够从应用程序的核心包(不依赖于特定的 GUI)提交后台任务,并观察任务的进度(如果有 GUI)(使用 GUI 特定的进度条等)。

Swing 的 SwingWorker<T, V> ( link ),JavaFX 有 Task<V> ( link ),Android 有 AsyncTask<Params, Progress, Result> (link)。它们都有相同的目的,并且实际上具有相似的 API。

此界面提供了后台任务有用的基本功能,实际上在所有提到的工具包中都可以找到该功能。

public interface BackgroundTask<Result, PartialResult> {

/**
* This is where the background computation belongs. Background thread.
* <p>
* Equivalent of {@link javax.swing.SwingWorker#doInBackground()}, {@link javafx.concurrent.Task#call()}
* and {@link android.os.AsyncTask#doInBackground()}.
*/
public Result computeResult();

/**
* Can be called from {@link #computeResult()} to update GUI with partial
* results. Background thread.
* <p>
* Equivalent of {@link javax.swing.SwingWorker#publish(Object[])}, and
* {@link android.os.AsyncTask#publishProgress(Progress)} (sort of). The equivalent in
* JavaFX is not just a simple method.
*/
public void partialUpdate(PartialResult... partials);

/**
* Called to process partial results. UI thread.
* <p>
* Equivalent of {@link javax.swing.SwingWorker#process(java.util.List)} and
* {@link android.os.AsyncTask#onProgressUpdate(Progress)}
*/
public void onPartialResult(List<PartialResult> partials);
}

我的后台任务将实现这个接口(interface)。我需要一些代码将BackgroundTask 的实例转换为Swing 中的SwingWorker(JavaFX 中的Task 和Android 中的AsyncTask)。

简单的实现如下:

public class SwingBackgroundTask<Result, PartialResult> extends SwingWorker<Result, PartialResult> {
private final BackgroundTask<Result, PartialResult> task;

public SwingBackgroundTask(BackgroundTask<Result, PartialResult> task) {
this.task = task;
}

@Override
protected Result doInBackground() throws Exception {
return task.computeResult();
}

@Override
protected void process(List<PartialResult> chunks) {
task.onPartialResult(chunks);
}
}

但是,这并没有什么用处。显然,我无法调用 SwingWorker 的 publish(partialResult)来自BackgroundTask 的computeResult() 内部。因此,我的用户永远不会看到后台任务的有意义的进展。当然,我可以使用不确定的进度条,但我不喜欢它们。

如何克服这个问题并制定通用后台任务?

最佳答案

当您尝试将流程与特定实现分离时,您将需要提供某种 API,以允许您以某种统一的方式提供反馈。

可能最简单的方法是为 BackgroundTask 类提供某种类型的观察者/监听器,感兴趣的各方可以向其注册以获取通知,并且 BackgroundTask 可以使用它来提供反馈。

这将允许BackgroundTask引发有关给定状态更改或其他通知的事件,并且实现将能够以特定于实现的方式进行处理。

关于java - 如何实现与 UI 无关的后台工作任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24173832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com