- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我对 Task
的概念很困惑/Service
在 JavaFX 中。
我在后台工作中使用了一个基于后台线程的模型,它调用 Platform.runLater
对于 UI 的任何更新。
假设我对进度条等不感兴趣。我正在对我的模型做一些真正的工作,必须在 GUI 的 View 中更新(例如,根据后台的某些连接随时间更新的参与者列表,基于某些用户输入的参与者列表,按年龄分类和起源)。这就是我通常使用我启动的后台线程实现的目标,并在其中使用 Platform.runLater
.
现在在 JavaFX 2 中,他们使用 Task
拥有所有这些并发性。 s 和 Service
s,建议最好使用它们。但是我没有看到任何可以实现我所说的内容的示例。
通过绑定(bind)一些属性来更新进度条很好(但这些是关于任务的信息,而不是你的模型)。
那么,我如何才能根据我的模型实际更新 View 的内容呢?我应该打电话Platform.runLater
从内部Task
?如果不是,机制是什么?我如何捕捉任务何时成功并获得结果(实际模型的更新)以更新 View ?
不幸的是,Oracle 的教程在这方面不是很好。向我指出一些好的教程也会有所帮助。
最佳答案
Task
和 Service
类旨在鼓励在 GUI 编程中的一些(但不是全部)常见场景中的良好实践和正确使用并发。
一个典型的场景是应用程序需要执行一些逻辑来响应可能需要很长时间的用户操作(可能是长时间的计算,或者更常见的是数据库查找)。该过程将返回一个结果,然后用于更新 UI。如您所知,长时间运行的进程需要在后台线程上执行以保持 UI 响应,并且对 UI 的更新必须在 FX 应用程序线程上执行。Task
类为这种功能提供了抽象,并表示执行并产生结果的“一次性”任务。 call()
方法将在后台线程上执行,旨在返回进程的结果,并且在 FX 应用程序线程上通知任务完成时的事件监听器。强烈建议开发人员初始化 Task
具有不可变状态的实现并具有 call()
方法返回一个不可变对象(immutable对象),这保证了后台线程和 FX 应用程序线程之间的正确同步。
这些类型的任务还有其他常见要求,例如随着任务的进行更新消息或进度。应用程序可能还需要监视类的生命周期状态(等待运行、正在运行、已完成、因异常而失败等)。正确编程非常困难,因为它必然涉及在两个不同线程中访问可变状态,并且有许多应用程序开发人员不知道其中的微妙之处。 Task
类为这种功能提供了简单的钩子(Hook),并负责所有的同步。
要使用此功能,只需创建一个 Task
谁的call()
方法返回您的计算结果,为状态从 RUNNING
转换时注册一个处理程序至 SUCCEEDED
,并在后台线程中运行任务:
final Task<MyDataType> task = new Task<MyDataType>() {
@Override
public MyDataType call() throws Exception {
// do work here...
return result ;
}
};
task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
MyDataType result = task.getValue(); // result of computation
// update UI with result
}
});
Thread t = new Thread(task);
t.setDaemon(true); // thread will not prevent application shutdown
t.start();
Task
维护一个
state
属性,使用常规 JavaFX 实现
ObjectProperty
.
Task
本身包含在
Callable
的私有(private)实现中,以及
Callable
implementation 是传递给父类(super class)构造函数的对象。因此,
Callable
的
call()
方法实际上是在后台线程中执行的方法。
Callable
的
call()
方法实现如下:
Platform.runLater()
的 FX 应用程序线程上安排调用(即使用 state
) ,先到SCHEDULED
,然后到 RUNNING
call()
Task
的方法(即用户开发的 call()
方法)value
的 FX 应用线程上安排调用call()
的结果的属性方法 state
的 FX 应用线程上安排调用属性(property)到SUCCEEDED
state
的监听器。属性,并且由于在 FX 应用程序线程上调用了状态更改,因此这些监听器的
handle()
也将被调用。方法。
Service
类通过
createTask()
简单地为此提供了一个包装器。方法。当
Service
启动,它得到一个
Task
实例通过调用
createTask()
,通过它的
Executor
执行它,并相应地转换自己的状态。
Task
或
Service
实现。如果您只有一个背景
Thread
在应用程序的整个持续时间内运行(因此它代表一个连续的过程,而不是一次性任务),然后是
Task
类(class)不太合适。这方面的示例可能包括游戏循环或(可能)轮询。在这些情况下,您最好使用自己的
Thread
与
Platform.runLater()
更新 UI,但当然您必须处理两个线程可能访问的任何变量的正确同步。根据我的经验,值得花一些时间考虑是否可以将这些要求重新组织为适合
Task
的内容。或
Service
模型,好像可以做到这一点,结果代码结构通常更清晰,更易于管理。然而,在某些情况下肯定不是这种情况,在这种情况下使用
Thread
和
Platform.runLater()
是合适的。
Service
class 看起来是一个很好的候选者,但事实证明很难有效地管理周期性。 JavaFX 8 引入了
ScheduledService
类很好地处理了此功能,并且还添加了对后台任务重复失败等情况的处理。
关于JavaFX 2 : background and Platform. runLater vs 任务/服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25224323/
我们正在创建一个 n 层 Silverlight LOB 应用程序,并且正在考虑使用 .NET RIA 服务。我们不清楚这与我们当前的 WCF 服务 API 的关系在哪里。我们当前的架构是: 银光
上下文:我在celery + rabbitmq堆栈上有一个主工作系统。 系统已docker化(此处未提供worker服务) version: '2' services: rabbit:
我是 Windows Azure 新手,我正在尝试将我的 Web 应用程序部署到 Windows Azure。在我的应用程序中,我使用了一些 Web 服务,现在我想知道如何在 Windows Azur
因此,根据我对服务的了解,自定义对象似乎是写入服务以返回数据的方式。如果我正在编写将用于 1) 填充数据库或 2) 为网站提供信息的服务,是否有返回数据集/数据表而不是包含所有这些的自定义对象列表的用
我在 google 和 stackoverflow 上都找过答案,但似乎找不到。我正在尝试将 azure 实验的输出获取到应用程序。我使用 ibuildapp 和谷歌表单制作了该应用程序。如何使用 g
我不小心删除了 kubernetes svc: service "kubernetes" deleted 使用: kubectl delete svc --all 我该怎么办?我只是想删除服务,以便
我正在努力确定解决网络服务问题的最有效方法。 我的情况:我正在开发一个 Android 应用程序,它通过 Web 服务从 mysql 数据库(在我自己的服务器 PC 上)存储和检索数据。用户按下提交按
我一直在翻阅 Android 文档,我很好奇。什么时候绑定(bind)服务而不是不绑定(bind)服务?它提供了哪些优点/限制? 最佳答案 When would you bind a service
我试图从架构的角度理解 hive,我指的是 Tom White 关于 Hadoop 的书。 我遇到了以下关于配置单元的术语:Hive Services、hiveserver2、metastore 等。
我的问题:安装服务后我无法导航到基地址,因为服务不会继续运行(立即停止)。我需要在服务器或我的机器上做些什么才能使 baseAddress 有效吗? 背景:我正在尝试学习如何使用 Windows 服务
我正在努力就 Web 服务的正确组织做出决定。我应该有多个 ASMX 来代表 Web 服务中的不同功能,还是应该有一个 ASMX? 如果我有多个 ASMX,这不构成多个 Web 服务吗? 如果我只有一
我正在从事一个在 azure 平台上提供休息服务的项目。该服务由 iPhone 客户端使用,这是选择其余方法的重要原因之一。 我们希望通过 AccessControlService(ACS) 并使用
我是 Ionic 新手,正在使用 Ionic 3.9.2 我有几个终端命令来为我的 ionic 应用程序提供服务,但是,我没有发现这两个命令之间有任何区别。 ionic serve 和 ionic s
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
作为项目的一部分,我期待着问这个问题。我过去有开发和使用 Web 服务的经验,并且非常熟悉这些服务。但是,有人告诉我,作为下一个项目的一部分,我将需要使用“安全”的 Web 服务。您能否提供一些见解,
我浏览了很多关于这个问题的信息,但找不到解决方案。这里的问题是,我想使用 Apache Cordova 和 Visual Studio 连接到 wcf。因此,如果有人找到合适的工作解决方案,请发布链接
我在 Windows 服务中托管了一个 WCF(从 MS 网站示例中选取),我可以使用 SOAP UI 访问和调用方法。但是,当我尝试使用 jquery 从 Web 应用程序调用相同的方法时,我不断收
我们构建了一个 Android 应用程序,它从 Android 向我的 PHP 服务器发送 HTTP 请求。作为响应,Web 服务将 JSON 对象发送到 Android 应用程序以显示结果。 就像其
我想在 android 应用程序中调用 soap web 服务,它需要一个枚举值作为参数,它是一个标志枚举。如何从 Android 应用程序将一些值作为标志枚举传递给此 Web 服务方法? 我使用 K
我尝试在模拟器上安装 Google Play。我已按照 Google Dev Site 中的说明进行操作. 使用 ADV 管理器似乎没问题,设备的目标是 Google API 版本 22,但是当我运行
我是一名优秀的程序员,十分优秀!