如果我希望它们被阻止,为什么不在EDT上运行长任务

时间:2016-06-08 12:40:20

标签: java

我理解在Java中有一些类,例如Swing worker,用于处理需要很长时间才能处理的事情,因此不会阻止EDT(事件调度线程)。但为什么不呢?

我有一个应用程序,所采取的每个用户操作都应该是一个阻止操作。所以在这样的情况下,我不应该在EDT线程上运行吗?

例如。如果用户单击加载和处理电子表格的项目。然后我不希望用户在处理完成之前进入下一步。我不能在EDT上这样做,以确保事件的“顺序”。

我错过了什么?

3 个答案:

答案 0 :(得分:2)

问题是阻止EDT还会阻止任何UI更新,因此您的UI可能看起来没有响应。在这种情况下,您通常会使用模式对话框,这使得UI仅在流程完成后接受进一步的用户输入。例如,这样做可以让你显示一些不确定的进度条(即“工作”动画) - 即用户感觉应用程序不再响应。

除了模态对话框之外还有其他选项(例如使用玻璃窗格等),请查看示例:Creating a nice "LOADING..." animation

答案 1 :(得分:2)

让您的UI能够满足用户操作被认为是一种好习惯。在您的情况下,对于长任务,通常会添加取消按钮,以便用户可以在他们认为必要时取消操作。

可以在EDT上做所有事情,但我会建议反对它。有些人倾向于将(完全)无响应的UI视为应用程序死亡的标志。

在我看来,有一些UI组件向用户显示(冗长的)操作正在进行中。

答案 2 :(得分:2)

您只是反对Java GUI应用程序的基本/常见设计思想。

如果您希望用户“等待”,那么例如,您可以设置模态窗口,只是不允许他在任何其他位置单击任何按钮。这样做......仍然允许更新GUI中的其他元素(例如,如果你在某处有某个“状态栏”)。

换句话说:是的,在EDT上做任何事都很容易,而且它可能很诱人,因为“简单的设计”;但有可能的是,在某些时候你会后悔这种“java标准/最佳实践”的偏差。如果发生这种情况......那么你将处于需要大量数量的变化才能摆脱它的位置。

最后,永远不要忘记wtf-code-quality-metric;并接受以这种方式滥用EDT将保证你在评论中有很多WTF。

wtf code quality metric