Dre*_*een 7 java concurrency multithreading javafx javafx-2
我正在为我的应用程序创建UI,它与其他平台的版本共享一个核心模块.在JavaFX中,我正在尝试使用Tasks在后台执行操作,但我无法弄清楚如何更新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();
}
};
}
Run Code Online (Sandbox Code Playgroud)
在我的UI线程中,我希望能够做这样的事情来更新我的图形UI:
loginTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
// perform an UI update here depending on the state t
}
});
Run Code Online (Sandbox Code Playgroud)
Ser*_*nev 12
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;
}
};
}
Run Code Online (Sandbox Code Playgroud)
开始这项任务:
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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10715 次 |
| 最近记录: |