javafx - 如果您检查它的状态然后添加一个监听器,是否有可能错过一个事件?
问题描述
假设我有一个运行一些后台任务的 Worker。有可能发生这样的事情吗?
- 我检查了
State
工人的,它仍然是State.RUNNING
。 - 我将一个
ChangeListener
带有 lambda 的 state 属性添加到它完成时执行.stateProperty().addListener((o, v1, v2) -> doSomething())
- 在第 1 步和第 2 步之间,在后台线程中,worker 状态更改为
State.SUCCEEDED
.
现在,ChangeListener
永远不会触发,现在我实际上最终永远等待事件发生,因为它已经发生并且我错过了它。
如果这是可能的,我该如何预防?
解决方案
只要这发生在 JavaFX 应用程序线程上并且注册侦听器发生在您在检查状态后“将控件返回给 JavaFX”之前(即它发生在同一个事件处理程序、Platform.runLater
可运行/更改侦听器等中),您'将被通知更改。
原因如下: 对Task.state
属性的更改是在应用程序线程上完成的,该线程是您的代码运行的线程。这意味着在您将控件返回给 JavaFX 之前,它无法对属性进行更新,并且在添加侦听器之后,属性中包含的值仍然与您读取的值相同。
推荐阅读
- flutter - 在 StateNotifier Flutter 上获取布尔值时出错
- amazon-ec2 - Ansible & AWS SSM 连接/插件 & “密文是指不存在的客户主密钥”
- node.js - 为什么有些数组似乎有键值对
- r - 如何随机化数据帧的几列中的值 - 以便共享时原始值或未知
- swift - 如何通过可观察的链视图控制器演示者
- python - 我必须使用“IN 运算符”但不能在代码中使用“True”来获得“True”作为答案
- javascript - Javascript逐渐改变饱和度
- javascript - 刷新令牌google api(日历)
- intellij-idea - 无法在 IntelliJ IDEA 2021.2 中执行 Maven 包装器验证目标
- python - KivyMD - ScreenManager 和 ids