JavaFX从任务返回值

时间:2015-04-14 21:45:51

标签: java javafx

我是一名新的JavaFX程序员,目前我遇到了从JavaFX Task获取结果的问题。我想从Task中获取一个对象。这是我的简单代码。

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;
    }
}

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

1 个答案:

答案 0 :(得分:4)

您无法在匿名内部类(或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
    }
});

正如其中一条评论中提到的那样(并且作为旁白),您应该在启动线程之前注册处理程序,否则在线程完成之前无法确定处理程序是否已注册。