【问题标题】:JavaFX concurrent task setting stateJavaFX 并发任务设置状态
【发布时间】:2012-12-05 19:12:54
【问题描述】:

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

这就是我想要做的。 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 中没有任何内容。

【问题讨论】:

    标签: xmlrpc java multithreading concurrency javafx-2 javafx


    【解决方案1】:

    Task 状态不打算用于用户逻辑。引入它们是为了控制Task 流。要将用户逻辑添加到Task,您需要使用result 概念。在您的情况下,您可能希望使用 Task&lt;Boolean&gt; 并且您的任务结果将是 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 2012-11-16
      • 2016-06-16
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多