Состояние настройки параллельной задачи JavaFX

Я создаю пользовательский интерфейс для своего приложения, которое разделяет основной модуль с версиями для других платформ. В JavaFX я пытаюсь использовать Task делать что-то в фоновом режиме, но я не могу понять, как обновить состояние задачи.

Это то, что я пытаюсь сделать. Переменная user содержит экземпляр класса, который выполняет xmlrpc запросы:

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

}

В моем потоке пользовательского интерфейса я хочу иметь возможность сделать что-то подобное, чтобы обновить свой графический интерфейс:

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

Как я должен установить состояние? Ничего подобного в Task API нет.


person Dreen    schedule 18.12.2012    source источник


Ответы (1)


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();
person Sergey Grinev    schedule 18.12.2012