任务中的 JavaFX return 值
JavaFX return value from task
我是一名新的 JavaFX 程序员,目前我在从 JavaFX 任务获取结果时遇到问题。我想从任务中获取一个对象。这是我的简单代码。
public class MyClass
{
public static void main(String[] args)
{
final MyTask task = new MyTask();
Thread th = new Thread(task);
th.start();
MyObject result;
task.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED,
new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
result = task.getValue();
}
});
}
}
public class MyTask extends Task<MyObject>
{
MyObject object;
@Override
protected MyObject call() throws Exception
{
// some basic processing
return object;
}
}
我得到一个错误,提示结果对象应该是最终的,如果我这样做,我就无法获得结果对象中的值。我试过在论坛和 google 上搜索,但找不到答案。任何帮助将不胜感激。谢谢。
您不能在匿名内部 class(或 lambda 表达式)中重新分配局部变量的值。问题是您不知道您的任务何时完成,因此您不知道何时调用处理程序。您所在的方法(示例中的 main
方法)到那时可能已经完成,因此局部变量将超出范围。因此,为其赋值并没有任何意义,因为您可能永远无法访问该值。
但是,您可以为实例变量(或在本例中为静态变量)赋值。因此,如果将 result
的声明移到 main
方法之外,它将起作用。
通常,当任务完成时,您只想处理结果(更新 UI)。所以通常你会做这样的事情:
task.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED,
new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
MyObject result = task.getValue();
// now do something with result
}
});
如评论之一所述(顺便说一句),您应该在启动线程之前注册处理程序,否则您无法确保在线程完成之前注册了处理程序。
我是一名新的 JavaFX 程序员,目前我在从 JavaFX 任务获取结果时遇到问题。我想从任务中获取一个对象。这是我的简单代码。
public class MyClass
{
public static void main(String[] args)
{
final MyTask task = new MyTask();
Thread th = new Thread(task);
th.start();
MyObject result;
task.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED,
new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
result = task.getValue();
}
});
}
}
public class MyTask extends Task<MyObject>
{
MyObject object;
@Override
protected MyObject call() throws Exception
{
// some basic processing
return object;
}
}
我得到一个错误,提示结果对象应该是最终的,如果我这样做,我就无法获得结果对象中的值。我试过在论坛和 google 上搜索,但找不到答案。任何帮助将不胜感激。谢谢。
您不能在匿名内部 class(或 lambda 表达式)中重新分配局部变量的值。问题是您不知道您的任务何时完成,因此您不知道何时调用处理程序。您所在的方法(示例中的 main
方法)到那时可能已经完成,因此局部变量将超出范围。因此,为其赋值并没有任何意义,因为您可能永远无法访问该值。
但是,您可以为实例变量(或在本例中为静态变量)赋值。因此,如果将 result
的声明移到 main
方法之外,它将起作用。
通常,当任务完成时,您只想处理结果(更新 UI)。所以通常你会做这样的事情:
task.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED,
new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
MyObject result = task.getValue();
// now do something with result
}
});
如评论之一所述(顺便说一句),您应该在启动线程之前注册处理程序,否则您无法确保在线程完成之前注册了处理程序。