Diferencias entre SwingWorker de Java y Android AsyncTask
Estaba comparando las diferencias entre Swing SwingWorker
y las clases AsyncTask
de Android. Mientras que Android tiene un hilo principal / UI Thread y luego genera un hilo de fondo (usando AsyncTask
), SwingWorker
tiene tres hilos que están involucrados:
- Tema actual
- Hilo de trabajo
- Hilo de envío de sucesos.
Y luego también me encontré con la declaración (en documentos) –
- ¿por qué mi método de comparación arrojar excepción - método de comparación viola su contrato general!
- En el oyente de cambio de fecha
- Android MediaRecorder stop () no se llama
- No se puede instanciar el receptor com.parse.GcmBroadcastReceiver
- Android - ¿Cómo crear una vista de lista seleccionable?
A menudo, el subproceso actual es el subproceso de envío de sucesos.
¿Ahora, que significa esto?
¿Significa que Swing también tiene sólo 1 subproceso – el subproceso principal e incluso los eventos se reciben en el mismo subproceso O ¿Es diferente para las diferentes implementaciones de JVM?
- Android - MediaPlayer's en Preparado Llamado incluso antes de que el flujo se prepare en Android 4.0+
- Android TextView NullPointerException con onTouchListener y onClickListener en 4.0
- Obtener la estructura de clase de un proyecto android
- Desactivar oscurecimiento oscuro en el cajón de navegación
- Cómo cargar sprite hoja con 5 filas y 5 columnas vista superior en android?
- Android: Cómo sumar todas las columnas de una base de datos SQLite y devolver 1 variable única
- Fusionar archivos de video mp4 en Android
- La aplicación muestra error en el nuevo dispositivo (piruleta) pero funciona bien en mi dispositivo antiguo (kitkat)
Esto solo es válido para Swing, que comparte algunas similitudes con la programación de la interfaz de usuario de Android, pero en realidad no es lo mismo.
Un poco de contexto
El EDT (hilo de envío de eventos) es el hilo de Swing dedicado a manejar eventos de UI (entrada de mouse y teclado, eventos en controles, representación de la interfaz de usuario, etc …). Se trata de un modelo de bucle de eventos, similar al que se realiza en Android.
El hecho de que los oyentes de eventos en Swing se ejecuten en el EDT es la causa principal para congelar las interfaces de usuario en aplicaciones de Swing: los desarrolladores malentendiendo el modelo de subprocesos a menudo ponen código de larga duración en los oyentes, lo que bloquea el EDT y por lo tanto la GUI.
SwingWorker
fue introducido para guiar mejor a los desarrolladores en la separación de las actualizaciones de la interfaz de usuario del código de fondo de larga ejecución. Genera un hilo de fondo dedicado para el procesamiento de E / S (o una tarea de larga ejecución) en doInBackground
y ejecuta actualizaciones de UI en los métodos done
y de process
. Mientras que estos 3 métodos garantizan en qué hilo serán ejecutados, todos los otros métodos se ejecutan en el subproceso actual.
¿Qué significa la oración que citó
La razón por la que SwingWorker existe es iniciar correctamente un proceso de larga ejecución desde la GUI, sin bloquear la GUI.
A menudo, será en reacción a la entrada de un usuario (por ejemplo, haciendo clic en un botón). Dado que las reacciones a la entrada del usuario (implementadas como Listeners) siempre se ejecutan en el EDT por el marco de Swing, a menos que se llame a execute
o get
de otro hilo explícitamente, se ejecutará en el EDT.
Por cierto, execute
es "fuego-y-olvidar" y es el caso de uso típico (llámelo de un oyente). get
en los bloques de otra mano, y no es adecuado para ser llamado de un oyente (que derrotaría el propósito de SwingWorker, llame a su propio hilos si es necesario)!
- Conexión PhoneGap con el servicio localhost webservice
- Error de Firebase: ¿cómo cargar programaticamente el archivo de asignación?