我有一个从我们的服务器下载信息(实体)的Java应用程序。我使用下载线程下载数据。
下载流程如下:
下载发生在一个线程中,因此GUI不会“冻结”。它还允许我更新进度条。
我需要帮助来管理这个过程。主要问题是当我下载实体数据时,我必须找到一种方法来等待线程完成,然后再尝试获取实体并转到应用程序流程中的下一步。
到目前为止,我已经使用模态对话框来控制流量。我启动线程,弹出一个模态,然后在线程完成时处理模态。模态/线程是Observer / Observable,线程在完成并对话框处理后更改了一个集合。显示模式有效地停止了应用程序的流程,因此它可以等待下载完成。
我还尝试将所有工作流程移至Observers。该过程中的所有相关GUI都是Observers。每个更新方法都等待下载完成,然后调用下一个自己下载的GUI。
到目前为止,我发现这两种方法产生的代码难以理解。我想“集中”这个工作流程,以便其他开发人员在试图跟随它时不会拔掉头发。
我的问题是:您是否有任何建议/示例可以以产生易于遵循的代码的方式管理此类工作流程?
我知道'easy'是一个相对的术语,我知道我的两个选项已经有效但我想从其他编码员那里得到一些想法,而我还有时间改变它。
非常感谢。
答案 0 :(得分:1)
您可能希望了解如何使用Future
界面。
停靠http://download.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html
它可以让您更轻松地完成这些任务。
答案 1 :(得分:0)
您必须为视图创建一个“模型”,表示应用程序的当前状态。对于树,例如当有人打开treenode时显示“正在加载”的节点是合理的,因为GUI会在打开节点时挂起。
如果加载线程完成加载节点,则“加载” - 节点将替换为异步操作的结果。这使得并行打开多个节点变得容易,因为所有工作线程都只负责一个子节点。
下载内容时类似:工作人员随后更新下载进度。这里会想到Firefox的下载对话框。
良好的GUI并不容易:)。
答案 2 :(得分:0)
我认为在最近的Java版本中最常用的方法是使用SwingWorker:
http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html
它允许您启动后台任务,并为您提供在Swing EDT上执行的方便的done()方法。