Android: AsyncTask OR normal Java threads con ExecutorService
Mi aplicación utiliza un Service
para hacer algunas cosas de fondo. Estoy utilizando subprocesos adicionales en el servicio para hacer algún cálculo. Para este propósito, creo dos hilos cada 5 a 10 segundos, que están ejecutando de 5 a 10 segundos. Pero no sé qué modelo de hilo debería usar:
-
AsyncTask:
- runOnUiThread no se está ejecutando en AsyncTask
- Cómo esperar el inicio de un subproceso en java
- Diferencia entre el hilo principal y el hilo de interfaz de usuario
- ¿Es esta una forma perfecta de detener handlerthread?
- Precisión del sueño del hilo
Pros:
- fácil de usar
- Específico de Android
- Interfaz de usuario fácil
Contras:
- Dado que tengo que utilizar el nivel de la API 10, no hay ningún
ExecutorService
con grupo de hilos fijo para ejecutar las AsyncTasks
-
Normal Java Hilos:
Pros:
- ExecutorService con conjunto de hilos fijo
Contras:
- No es tan fácil de manejar, por ejemplo interacción UI
¿Qué modelo es mejor usar? Especialmente en interés del rendimiento. ¿Hay una sobrecarga pesada cuando estoy usando AsyncTasks, y es el ExecutorService más rápido en la reutilización de los hilos de lo que Android en la creación de nuevas AsyncTasks?
- Progressdialog lento para mostrar en Android
- Simple hilo bloquea la aplicación para Android
- Puedo matar o terminar () una actividad en un hilo que no sea el hilo de la interfaz de usuario ...?
- Cómo suspender y reanudar los hilos en android?
- ¿Cuál es el método recomendado para sincronizar el acceso a un objeto en Java para Android?
- ¿Cómo funciona el multi-threading en Android?
- Handler no entrega un mensaje o un Runnable al subproceso principal
- Android - Cargando, por favor espere
Si observa la implementación de AsyncTask
, verá que utiliza su propio grupo de subprocesos utilizando "subprocesos Java normales".
¿Hay una sobrecarga pesada cuando estoy usando AsyncTasks, y es el ExecutorService más rápido en la reutilización de los hilos que Android en la creación de nuevas AsyncTasks?
No debe haber ninguna diferencia sustancial entre los dos.
Estoy usando Needle; Una biblioteca multithreading de código abierto, simple y potente para Android. Con él se puede decir cosas como:
Needle.onMainThread().execute(new Runnable() { @Override public void run() { // eg change one of the views } });
o
Needle.onBackgroundThread().execute(new UiRelatedTask<Integer>() { @Override protected Integer doWork() { int result = 1+2; return result; } @Override protected void thenDoUiRelatedWork(Integer result) { mSomeTextView.setText("result: " + result); } });
Pros
- API muy simple
- Tamaño del grupo de hilos fijo
- Tamaño de grupo de hilos personalizable
- Soporta la interacción de la interfaz de usuario ("haz el trabajo y luego usa el resultado en el subproceso de la interfaz de usuario")
- Android 1.5+
- Se comporta de la misma forma en todas las versiones de la plataforma
Contras
- Dependencia adicional de la biblioteca
Compruébelo en GitHub: https://github.com/ZsoltSafrany/needle