首页 > 解决方案 > 如何在连续任务(JavaFX)之间传递参数或引用?

问题描述

我有从 JavaFx 主线程触发的连续任务,每个任务都调用一个服务。我从一个任务中检索到的值应该决定下一个任务的行为方式。我已经通过方法(下面的简化示例)实现了它,但它有点像意大利面条代码。

import javafx.event.ActionEvent;
import javafx.concurrent.Task;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

public class SomeControllerClass{

    private Executor exec;

    @Autowired
    private UserService userService;
    @Autowired
    private SessionService sessionService;

    public void initialize() {
        exec = Executors.newSingleThreadExecutor(runnable -> {
            Thread t = new Thread(runnable);
            t.setDaemon(true);
            return t ;
            });
    }

    @FXML
    private void buttonAction(ActionEvent event){

        final String user = userTextField.getText().trim();
        final String pass = passTextField.getText().trim();

        Task<UserBean> task1 = new Task<UserBean>(){
            @Override
            protected UserBean call() throws Exception{
                return userService.getUserLogin(user, pass);
            }
        };
        task1.setOnSucceeded(e -> secondTask(task1.getValue()));
        task1.setOnFailed(e -> methodToNotifySomeException());
        exec.execute(task1);

    }

    private void secondTask(UserBean bean){

        //bean will be null only if the login failed
        if(bean==null) someLabel.setText("Wrong user or password");
        else{

            Task<Void> task2 = new Task<Void>(){
                @Override
                protected Void call() throws Exception{
                    sessionService.setActiveUser(bean);
                    return null;
                }
            };

            task2.setOnSucceeded(e -> methodToChangeScene());
            task2.setOnFailed(e -> manageSomeException());
            exec.execute(task2);
        }

    }

}

我也尝试过ExecutorService但它大致相同,我无法实例化我的连续任务找到第二个任务的方法来从第一个任务中检索一个值,而无需在方法中分离每个任务。

是否有任何我缺少的 Executor 实现可以让您在任务之间传递参数?是否有任何我完全不知道的“最佳实践”可以避免所有这些问题?

标签: javaspring-bootjavafxtaskjava.util.concurrent

解决方案


推荐阅读