2014-03-27 58 views
1

以下是我的任务初始化JavaFX的后台任务没有运行不止一次

 final Task<Void> vt=voiceTask(); 
     Button btn = new Button(); 
     btn.setText("Say"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       new Thread(vt).start(); 
      } 
     }); 

这里是任务编码

public Task<Void> voiceTask() { 
    return new Task<Void>(){ 
     @Override 
     protected Void call() throws Exception { 
      HelloWorld hw=new HelloWorld();// HelloWorld is simple .java class getting voice through sphinx 
      updateMessage(hw.Hello()); 
      return null; 

     } 

    }; 
}  

现在就点击BTN按钮的第一次,任务功能正常,但在点击后续时间任务不会被调用。

我想要在每次点击时调用任务。 请指教我如何修改我的代码这样做...

回答

3

查看JavaDocs

与FutureTask一样,任务是一次性类,不能重复使用。

每次按下按钮时都需要创建一个新的任务。

final Button btn = new Button(); 
    btn.setText("Say"); 
    btn.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      final Task<Void> vt=voiceTask(); 
      vt.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
       @Override 
       public void handle(WorkerStateEvent event) { 
        btn.setDisable(false); 
       } 
      }); 
      btn.setDisable(true); 
      new Thread(vt).start(); 
     } 
    }); 
+0

实际上,当任务开始时,我正在使用麦克风事件,现在按第二次按钮创建一个新任务,但麦克风只被旧任务占用。我想取消()旧线程,但这也没有解决问题。你能否建议我可以通过哪种方式来减轻旧线程占用的资源,使其完全终止,以便在再次按下按钮时,新任务可以使用这些资源。 –

+0

最简单的事情就是在任务运行时禁用按钮。我更新了代码来执行此操作。如果任务永远不存在,那么HelloWorld.hello()方法就是一个问题,这实际上是关于您使用的语音库的问题,而不是JavaFX问题。 –