2012-12-18 9 views
6

Tworzę interfejs użytkownika dla mojej aplikacji, która współużytkuje moduł podstawowy z wersjami dla innych platform. W JavaFX, próbuję użyć Task s do robienia rzeczy w tle, ale nie mogę się dowiedzieć, jak zaktualizować stan zadania.Stan ustawienia współbieżnego zadania JavaFX

Oto, co próbuję zrobić. Zmienna user posiada instancję klasy, która wykonuje wnioski:

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

} 

W moim UI wątek Chcę być w stanie zrobić coś takiego, aby zaktualizować wykres Ui:

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

jaki jestem Mam ustawić stan? Nie ma nic, co to robi w Task API.

Odpowiedz

11

Task stany nie są przeznaczone do użycia w logice użytkownika. Są one wprowadzone w celu sterowania przepływem Task. Aby dodać logikę użytkownika do Task, należy użyć koncepcji result. W twoim przypadku może chcesz używać Task<Boolean> i wynikiem Twoim zadaniem będzie TRUE dla poprawnych poświadczeń i FALSE za nieprawidłowe:

tworzenie Zadanie:

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

Uruchomienie tego zadania:

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(); 
Powiązane problemy