【发布时间】:2018-04-06 22:06:50
【问题描述】:
当我将逻辑放在 Runnable 中时,它工作得很好,只是我无法与 UI 线程交互。所以我试图把所有东西都放在一个扩展 Task 的类中,它可以工作,除了任务只执行一次。没有错误,我从 Task succeeded 方法中收到一条成功消息。
我也尝试在调用方法中使任务返回布尔值 true,但这没有帮助。
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception{
SyncTask syncTask = new SyncTask();
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(syncTask, 0, 10, TimeUnit.SECONDS);
Label syncEngineLabel = centralController.getScheduleTabMessageLabel();
syncEngineLabel.textProperty().bind(syncTask.messageProperty());
}
class SyncTask extends Task<Void>{
private Schedule schedule = null;
public SyncTask() {}
@Override
protected Void call() throws Exception {
System.out.println("we are in the task...");
if (getScheduleFromApi()){
updateMessage("New Schedule Retrieved...");
}
return null;
}
@Override protected void succeeded() {
super.succeeded();
System.out.println("succeeded");
}
@Override protected void cancelled() {
super.cancelled();
System.out.println("cancelled");
}
@Override protected void failed() {
super.failed();
System.out.println("failed");
}
private Boolean getScheduleFromApi(){
Gson gson = new GsonBuilder().serializeNulls().create();
ApiGet api = new ApiGet("schedule/get-schedule-by-room", parameters);
api.sendRequest();
if (api.isSuccess()){
schedule = gson.fromJson(api.response(), Schedule.class);
if (schedule.getStatus().equals("200")){
return true;
}
else{
updateMessage(schedule.getMsg());
return false;
}
}
else {
updateMessage("Failed to process API call to ASI Server.");
return false;
}
}
}
}
请注意,此代码实际上存在于控制器中,但我将其放在 Main 中以尝试提供自包含代码。
谢谢!
【问题讨论】:
-
您正试图多次执行同一个任务实例。
-
当我尝试 (?instantiate?) 在执行器内部时,它说表达式是预期的。如何为每次执行创建一个新实例?为什么我不能一遍又一遍地运行同一个实例?
executor.scheduleAtFixedRate(SyncTask, 0, 10, TimeUnit.SECONDS); -
根据documentation,您不能重复使用
Task。 (基本上,从SUCCEEDED到READY等会违反Task类的状态转换规范。)使用ScheduledService。 -
ok.. 有没有办法让我在执行程序中创建一个新实例,还是我需要创建一个被调用并创建实例的方法?
标签: java javafx-8 scheduled-tasks