Java的SwingWorker和Android AsyncTask之间的差异

时间:2014-12-15 10:48:22

标签: java android swing android-asynctask swingworker

我正在比较Swing的SwingWorker和Android的AsyncTask类之间的差异。虽然Android有一个主线程/ UI线程,然后生成一个后台线程(使用AsyncTask),SwingWorker有三个涉及的线程 -

  • 当前主题
  • 工作人员主题
  • 事件派遣线程。

然后我也发现了声明(在文档中) -

  

通常,Current线程是Event Dispatch Thread。

现在,这是什么意思?

这是否意味着Swing也只有 1个线程 - 主线程和 甚至事件都在同一个线程 OR 上收到 它对于不同的JVM实现是不同的吗?

1 个答案:

答案 0 :(得分:6)

这仅适用于Swing,它与Android UI编程有一些相似之处,但确实不一样。

一点上下文

EDT(事件调度线程)是Swing的线程,专门用于处理UI事件(鼠标和键盘输入,控件上的事件,UI的呈现等)。 这是一个事件循环模型,类似于Android中的操作。

Swing中的事件侦听器在EDT上执行的事实是在Swing应用程序中冻结UI的根本原因:开发人员误解线程模型通常会在侦听器中放置长时间运行的代码,从而阻止EDT,从而阻止GUI。

引入了

SwingWorker以更好地指导开发人员将UI更新与长时间运行的后台代码分离。它为doInBackground中的I / O处理(或长时间运行的任务)生成专用后台线程,并以doneprocess方法执行UI更新。虽然这3个方法保证了它们将在哪个线程中执行,但所有其他方法都在当前线程中执行。

你引用的句子是什么意思

SwingWorker存在的全部原因是从GUI正确启动长时间运行的进程,而不会阻止GUI。

通常,它会响应用户的输入(例如,单击按钮)。由于对用户输入的反应(作为监听器实现)总是由Swing框架在EDT中执行,除非你碰巧从另一个线程明确地调用executeget,它将在EDT上执行

顺便说一下,execute是“即发即忘”,是典型的用例(从听众那里调用)。另一方面 get 阻止不适合从侦听器调用(它会破坏SwingWorker的目的,如果需要,可以在自己的线程上调用它)!

相关问题