JavaFX并发任务设置状态

标签 java multithreading concurrency javafx-2 javafx

我正在为我的应用程序创建 UI,它与其他平台的版本共享一个核心模块。在 JavaFX 中,我尝试使用 Task s 在后台做事,但我不知道如何更新任务状态。

这就是我想要做的。 user 变量包含一个执行 的类的实例。要求:

public Task<Integer> doLogin()
{
    return new Task<Integer>() {
        @Override
        protected Integer call()
        {
            user.login();
            if (!user.getIsAuthorized())
            {
                // set the state to FAILED
            }
            else
            {
                // set the state to SUCCEDED
            }
            user.remember();
        }
    };

}

在我的 UI 线程中,我希望能够执行类似这样的操作来更新我的图形 UI:

loginTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
            @Override
            public void handle(WorkerStateEvent t) {
                // perform an UI update here depending on the state t
            }
        });

我应该如何设置状态?在 Task API 中没有任何东西可以做到这一点.

最佳答案

Task状态不打算用于用户逻辑。它们被引入控制Task流动。将用户逻辑添加到 Task你需要使用 result概念。在您的情况下,您可能想使用 Task<Boolean>你的任务结果将是TRUE用于正确的凭据和 FALSE对于不正确的:

任务创建:

public Task<Boolean> doLogin() {
    return new Task<Boolean>() {
        @Override
        protected Boolean call() {
            Boolean result = null;
            user.login();
            if (!user.getIsAuthorized()) {
                result = Boolean.FALSE;
            } else {
                result = Boolean.TRUE;
            }
            user.remember();
            return result;
        }
    };
}

开始那个任务:

final Task<Boolean> login = doLogin();
login.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
    @Override
    public void handle(WorkerStateEvent t) {
        // This handler will be called if Task succesfully executed login code
        // disregarding result of login operation

        // and here we act according to result of login code
        if (login.getValue()) {
            System.out.println("Successful login");
        } else {
            System.out.println("Invalid login");
        }

    }
});
login.setOnFailed(new EventHandler<WorkerStateEvent>() {
    @Override
    public void handle(WorkerStateEvent t) {
        // This handler will be called if exception occured during your task execution
        // E.g. network or db connection exceptions
        System.out.println("Connection error.");
    }
});
new Thread(login).start();

关于JavaFX并发任务设置状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13935366/

相关文章:

java - .properties 文件是否适合存储分层设置对象?

java - 升级apachestorm(1.0.0到1.2.3)

c# - 所有线程一次只能使用一种方法?

java - 方法调用和原子性

java - 将目录路径的正斜杠更改为反斜杠

java - While 循环、字符串

c++ - qt中线程的使用方法

c - Posix Pthread 互斥

java - Log4j 记录器和并发

java - Jetlang PoolFiber 示例