2012-12-18 102 views
6

我正在为我的应用程序创建UI,该应用程序与其他平台的版本共享一个核心模块。在JavaFX中,我试图使用Task在后台执行任务,但我无法弄清楚如何更新任务状态。JavaFX并发任务设置状态

这就是我想要做的。该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线程:

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

怎么了我应该设置状态?在Task API中没有这样做。

回答

11

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