Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java和x27之间的差异;s SwingWorker和Android异步任务_Java_Android_Swing_Android Asynctask_Swingworker - Fatal编程技术网

Java和x27之间的差异;s SwingWorker和Android异步任务

Java和x27之间的差异;s SwingWorker和Android异步任务,java,android,swing,android-asynctask,swingworker,Java,Android,Swing,Android Asynctask,Swingworker,我在比较Swing的SwingWorker和Android的AsyncTask类之间的差异。Android有一个主线程/UI线程,然后生成一个后台线程(使用AsyncTask),而SwingWorker有三个线程- 当前线程 工作线程 事件调度线程 然后我也看到了这个声明(在文档中)- 通常,当前线程是事件分派线程 这是什么意思 这是否意味着Swing也只有一个线程-主线程和 甚至事件都是在同一线程上接收的或 不同的JVM实现是否不同?这只对Swing有效,Swing与Android UI编

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

  • 当前线程
  • 工作线程
  • 事件调度线程
然后我也看到了这个声明(在文档中)-

通常,当前线程是事件分派线程

这是什么意思

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

这只对Swing有效,Swing与Android UI编程有一些相似之处,但实际上并不相同

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

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

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

你引用的句子是什么意思 SwingWorker存在的全部原因是从GUI正确地启动一个长时间运行的进程,而不阻塞GUI

通常,它会对用户的输入做出反应(例如,单击按钮)。由于对用户输入的反应(作为侦听器实现)总是由Swing框架在EDT中执行,除非您碰巧从另一个线程显式调用
execute
get
,否则它将在EDT上执行


顺便说一下,
execute
是“fire-and-forget”,是典型的用例(从侦听器调用)
get
另一方面是阻塞,并且不适合从侦听器调用(这会破坏SwingWorker的目的,如果需要,在您自己的线程上调用它)

Swing不是java。Android为每个应用程序启动一个新的(linux)单线程进程。该线程主要负责触摸事件和绘制。Java Swing也应该如此。两者都是单线程awt模型是的,Android是单线程应用程序,这意味着所有UI操作都是在UI线程上完成的。可能需要很长时间才能响应的任何其他任务都是单独创建的。并且AsynchTask在Android运行时创建的执行器上运行。这意味着它可以运行或排队,而无需您强制它们成为工作者或执行者。虽然我有点同意上一句话,但我仍然不相信这一点。也许你可以解释得更详细一些。谢谢,它澄清了很多。我还有一些疑问,我会读更多的。如果你有更多关于这方面的信息,请发布链接。