¿Por qué el AsyncTask de mi servicio bloquea AsyncTasks de la actividad principal?
Estoy tratando de escribir un servicio simple que hará algo cada pocos segundos. Pero cuando ejecuto el servicio mientras intento ejecutar otras AsyncTasks en la actividad principal, noté que las otras AsyncTasks se atascan en onPreExecute. Cuando me discapacitado el servicio, todo funcionaba como esperaba. ¿Hay una razón por la AsynTask del servicio está bloqueando los AsyncTasks otros?
Servicio
- ¿Puedo bloquear una tabla SQLite para el subproceso actual?
- Es la biblioteca Java.util.concurrent mejor al hacer cualquier tipo de tarea sobre el estándar Android AsyncTask
- Acceso a la interfaz de usuario de JavaScript en Android
- Pasar variables entre el renderizador y otra clase con queueEvent ()
- Acceso multiproceso y caché variable de subprocesos
public class SVC_SyncData extends Service { private final String TAG = "SVC_SyncData"; private AT_SyncData m_SyncPoll = null; public static boolean isRunning = false; public SVC_SyncData() { } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Log.i(TAG, "onCreate"); m_SyncPoll = new AT_SyncData(this); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "onStartCommand"); m_SyncPoll.execute(); isRunning = true; return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestroy"); m_SyncPoll.cancel(false); isRunning = false; } }
AT_SyncData's doInBackground
@Override protected Void doInBackground(Void... params) { Log.i(TAG, "doInBackground"); try { while (!isCancelled()) { Log.i(TAG, "syncData"); // Sleep until next cycle Thread.sleep(5000); } } catch (Exception ex) { ex.printStackTrace(); } return null; }
- ¿La publicación de Runnable a un hilo de interfaz de usuario garantiza que el diseño esté terminado cuando se ejecuta?
- Voleadas asincrónicas en android SyncAdapter
- Handler.post (runnable) no ejecuta siempre el método run en android
- Actualización y bloqueo de CountDownTimer
- Despertar un hilo de dormir - interrupción () versus "dividir" el sueño en varios sueños
- Sincronizar varias ventanas con varias vistas en Android
- Multithreading en Android
- Acceso al dominio desde un subproceso incorrecto Android
La documentación AsyncTask establece:
Orden de ejecución
Cuando se introdujeron por primera vez, AsyncTasks se ejecutaron en serie en un solo hilo de fondo. Comenzando con DONUT, esto fue cambiado a un grupo de hilos permitiendo que múltiples tareas funcionaran en paralelo. Comenzando con HONEYCOMB, las tareas se ejecutan en un solo hilo para evitar errores de aplicación comunes causados por la ejecución paralela.
Si realmente desea una ejecución paralela, puede invocar executeOnExecutor (java.util.concurrent.Executor, Object []) con THREAD_POOL_EXECUTOR.
Por lo tanto, las versiones más recientes de Android tendrán este problema que usted describe. Debe utilizar executeOnExecutor para asegurarse de que se está ejecutando en subprocesos separados.
Además, si tiene un servicio que desea ejecutar en un hilo separado, recomiendo:
- Utilizar un IntentService
- A veces necesitarás más control sobre el ciclo de vida de tu servicio que lo que IntentService te da, en esos casos solo puedes crear un hilo en el servicio y ejecutar tu código de fondo en eso. En realidad, para ser más específico, cree un HandlerThread que incluya un Looper para que pueda utilizar el método android estándar para la comunicación (mensajes) entre su hilo principal y el hilo de fondo. Personalmente, yo suelo elegir esta opción para mis servicios.
Si está en un servicio sólo tiene que utilizar un hilo o Callable. AsyncTask es para los subprocesos de interfaz de usuario. Un servicio no es un subproceso de interfaz de usuario.
Esto es lo que la API dice: "AsyncTasks idealmente debe ser utilizado para operaciones cortas (unos pocos segundos a lo sumo.) Si necesita mantener los temas en ejecución durante largos períodos de tiempo , es muy recomendable utilizar las diversas API proporcionadas por el java .util.concurrent pacakge como Executor, ThreadPoolExecutor y FutureTask "
AsyncTask
- ¿Cuál es el estado de mi actividad una vez que mi proceso de solicitud ha sido matado?
- Espaciado de Android GridView y cuestión de centro