假设我有一个执行一些后台任务的工作程序。这样的事情有可能发生吗?
State
,现在仍然是State.RUNNING
。ChangeListener
,并在其完成.stateProperty().addListener((o, v1, v2) -> doSomething())
时执行一个lambda State.SUCCEEDED
。现在,ChangeListener
永远不会触发,现在我实际上永远永远等待事件发生,因为事件已经发生,我错过了。
如果可能的话,如何预防呢?
答案 0 :(得分:3)
只要这发生在JavaFX应用程序线程上,并且注册侦听器就发生在检查状态后将控件“返回到JavaFX”之前(即,它发生在同一事件处理程序Platform.runLater
中,可运行/更改中)侦听器等),您会收到有关更改的通知。
这是原因:对Task.state
属性的更改是在应用程序线程(代码在其上运行的线程)上完成的。这意味着,除非您将控件返回给JavaFX,否则它将无法对属性进行更新,并且在添加侦听器之后,该属性中包含的值仍然与您读取的值相同。