¿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

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 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:

  1. Utilizar un IntentService
  2. 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

  • Equivalente a javax.swing.Timer en Android
  • Trabajos de fondo de Android para la sincronización con un servicio web
  • Android AsyncTask onPostExecute fuera del hilo principal de ui
  • Cómo pausar y reanudar un subproceso de surfaceView
  • Bloqueo de archivos a través de servicios
  • Cómo establecer la prioridad de IntentService en Android
  • Realizando operaciones de larga duración en onDestroy
  • ¿Cómo ejecutar mi código en el hilo específico?
  • Diferencia entre MainThread, UiThread, WorkerThread, BinderThread en Android Annotation
  • Android Runtime Logcat solo obtiene la instancia actual
  • Otto eventbus para android se comporta de forma diferente en la versión de lanzamiento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.