我需要从worker/task线程中的自定义类更新进度。我该怎么做?
public Task createWorker() {
Task task = new Task() {
@Override
protected Object call() throws Exception {
DocumentProcessor dp = new DocumentProcessor();
dp.proces(this);
}
public void notifyTask(String _msg, long _stepNumber, long _totalSteps ){
updateMessage(_msg);
updateProgress(_stepNumber, _totalSteps);
}
};
}
分类:
public class DocumentProcessor {
public void proces(Task _task){
// Step 1
_task.notifyTask("Step 1 done", 1 ,2); // ERROR: no function with that name
// Step 2
_task.notifyTask("Step 2 done", 2 ,2);
}
}
调用
Task worker = createWorker();
new Thread(worker).start();
notifyTask函数不可用。
2条答案
按热度按时间hl0ma9xz1#
notifyTask
方法不可用,因为它没有包含在Task
类中,而是在您的(匿名)子类中定义的。例如,您可以创建一个命名的子类并将其传递给
DocumentProcessor
。你也可以定义一个接口,并让你的类实现它,以实现更松散的耦合。
您可能需要将
NotifiableTask
声明为当前定义createTask
方法的内部类,因为它需要在notifyTask()
期间调用其他方法(updateMessage()
和updateProgress()
)。实际上,由于任务本身只委托这个调用,您还不如在外部类中声明接口并在那里执行更新;但这取决于上下文,并且很难说清楚,因为您显然只提供了一个最小化的示例。5gfr0r5j2#
您遇到的问题是**
Task
类中没有定义notifyTask
方法。要解决这个问题,可以创建一个Task
的自定义子类,其中包含notifyTask
**方法,然后使用该子类。这可能是一个更简单和更直接的方法。你可以试试这个:这样就可以创建一个名为**
CustomTask
的子类,它扩展了Task<Void>
。包含notifyTask
方法,可从DocumentProcessor
类调用。创建worker时,示例化CustomTask
,而不是Task
。这样,您就可以访问DocumentProcessor
类中的notifyTask
方法。或者,如果您想在不修改
Task class
的情况下,从DocumentProcessor
类内部更新进度和消息,可以通过回调接口或函数接口给DocumentProcessor
**构造函数。你可以试试这个:其中**
DocumentProcessor
类在其构造函数中有一个ProgressCallback
接口,该接口定义了notifyTask
方法。回调中的notifyTask
方法负责更新UI中的进度和消息,或者其他任何需要的方式。在
Main
类中,匿名实现ProgressCallback
接口,并传递给DocumentProcessor
构造函数。在回调实现中,我们使用Platform.runLater()
更新UI元素,以确保在UI线程上执行更新。这里我使用
System.out.println()
**来演示进度更新。您应该用适当的代码来替换它,以便用进度和消息更新UI元素。