来自任务的JavaFX返回值

来自任务的JavaFX返回值,java,javafx,Java,Javafx,我是一名新的JavaFX程序员,目前在获取JavaFX任务的结果方面遇到了问题。我想从任务中获取一个对象。这是我的简单代码 public class MyClass { public static void main(String[] args) { final MyTask task = new MyTask(); Thread th = new Thread(task); th.start(); MyObje

我是一名新的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;
    }
}
公共类MyClass
{
公共静态void main(字符串[]args)
{
最终MyTask任务=新建MyTask();
线程th=新线程(任务);
th.start();
对象结果;
task.addEventHandler(WorkerStateEvent.WORKER_状态_成功,
新的EventHandler(){
@凌驾
公共无效句柄(WorkerStateT事件){
结果=task.getValue();
}
});
}
}
公共类MyTask扩展了任务
{
MyObject对象;
@凌驾
受保护的MyObject调用()引发异常
{
//一些基本的处理
返回对象;
}
}

我得到一个错误,结果对象应该是最终的,如果我这样做,那么我就不能得到结果对象中的值。我试着在论坛和谷歌上搜索,但我找不到答案。任何帮助都将不胜感激。谢谢。

您不能在匿名内部类(或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
    }
});
task.addEventHandler(workerstatevent.WORKER\u STATE\u成功,
新的EventHandler(){
@凌驾
公共无效句柄(WorkerStateT事件){
MyObject结果=task.getValue();
//现在做一些有结果的事情
}
});

如其中一条注释所述(顺便说一句),您应该在启动线程之前注册处理程序,否则无法确保在线程完成之前注册处理程序。

您不能在匿名内部类(或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
    }
});
task.addEventHandler(workerstatevent.WORKER\u STATE\u成功,
新的EventHandler(){
@凌驾
公共无效句柄(WorkerStateT事件){
MyObject结果=task.getValue();
//现在做一些有结果的事情
}
});

正如其中一条评论中提到的(顺便说一句),您应该在启动线程之前注册处理程序,否则无法保证在线程完成之前已注册处理程序。

您的示例中存在大量语法错误。你能把它清理一下吗?不应该
返回对象是否放在调用()中?
?我在这里键入了代码,因此出现了错误,现在已清除。在向其添加事件处理程序之前,如何确保任务没有完成?我还尝试了“task.setOnSucceeded(new EventHandler(){@Override public void handle(workerstatevent t){result=task.getValue();}”;'您的示例中有很多语法错误。你能把它清理一下吗?不应该
返回对象是否放在调用()中?
?我在这里键入了代码,因此出现了错误,现在已清除。在向其添加事件处理程序之前,如何确保任务没有完成?我还尝试了“task.setOnSucceeded(new EventHandler(){@Override public void handle(workerstatevent t){result=task.getValue();}”;'谢谢,它解决了这个问题,但我也理解你和其他人所指出的。我可能需要重新考虑我的计划。我想在另一个任务中使用此任务的结果。让一个后台任务运行多个子任务有意义吗?您可以从第一个任务的onSucceeded处理程序启动第二个任务。谢谢,它解决了这个问题,但我也理解您和其他人所指出的。我可能需要重新考虑我的计划。我想在另一个任务中使用此任务的结果。让一个后台任务运行多个子任务有意义吗?您可以从第一个任务的onSucceeded处理程序启动第二个任务。