Различия между Java SwingWorker и Android AsyncTask

Я сравнивал различия между SwingWorker и классами SwingWorker Android. В то время как Android имеет Thread Thread / UI Thread, а затем порождает фоновый поток (используя AsyncTask ), SwingWorker имеет три потока, которые задействованы –

  • Текущая тема
  • Рабочая нить
  • Событие Dispatch Thread.

И затем я также встретил заявление (в документах) –

Часто текущий поток – это поток событий.

Теперь, что это значит?

Означает ли это, что Swing также имеет только 1 поток – главный поток и даже события, полученные в одном и том же потоке. Или он отличается для разных реализаций JVM?

Это справедливо только для Swing, который имеет некоторое сходство с программированием на Android UI, но на самом деле это не то же самое.

Немного контекста

EDT (Thread Dispatch Thread) – это поток Swing, посвященный обработке событий пользовательского интерфейса (ввод мыши и клавиатуры, события на элементах управления, отображение пользовательского интерфейса и т. Д.). Это модель Event Loop, аналогичная тому, что сделано в Android.

Тот факт, что прослушиватели событий в Swing выполняются на EDT, является основной причиной замораживания пользовательских интерфейсов в приложениях Swing: разработчики, не понимающие модель потоковой передачи, часто ставят длинный код в слушателях, что блокирует EDT и, следовательно, графический интерфейс.

SwingWorker был представлен для лучшего руководства разработчиками в разделении обновлений пользовательского интерфейса из давно работающего кода фона. Он создает выделенный фоновый поток для обработки ввода-вывода (или долговременной задачи) в doInBackground и выполняет обновления пользовательского интерфейса в doInBackground и process методах. Хотя эти 3 метода гарантируют, в каком потоке они будут выполнены, все остальные методы выполняются в текущем потоке.

Что подразумевается под предложением, которое вы цитировали

Вся причина существования SwingWorker заключается в том, чтобы должным образом инициировать длительный процесс из графического интерфейса, не блокируя графический интерфейс.

Часто он будет реагировать на ввод пользователя (например, нажатие кнопки). Поскольку реакции на вход пользователя (реализованные как Listeners) всегда выполняются в EDT с помощью среды Swing, если только вы не вызываете вызов или не get из другого потока явно, он будет выполнен в EDT.

Кстати, execute «огонь и забыть» и является типичным прецедентом (назовите его слушателем). get с другой стороны блоки и не подходит для вызова из прослушивателя (это победит цель SwingWorker, при необходимости вызовет его на ваши собственные потоки)!

Intereting Posts
ActionMode с выравниванием содержимого панели инструментов Сканирование iBeacon Обнаружение активности пользователей (запуск, циклирование, вождение) с помощью Android Как вы включаете имя пользователя при хранении электронной почты и пароля с помощью Firebase (BaaS) в приложении для Android? Почему LogCat показывает все элементы как предупреждения (оранжевые)? Как получить базовую строку из JsonParser (Jackson Json) Зарегистрировать ContentObserver в приложении Application.OnCreate () VS Service Чат и приложение VOIP Отсутствует пакет javax.annotation.processing для Android. Невозможно использовать AbstractProcessor Как отображать ImageView постепенно вниз сверху вниз Eclipse logcat с одним дисплеем columnTID Android – Заголовки категорий в PreferenceActivity с PreferenceFragment Не удалось записать основной дамп. Minidumps по умолчанию не включены в клиентских версиях Windows в Eclipse Проверка правильности RxJava-RxAndroid на динамическом EditText В чем разница между реализацией и компиляцией в gradle