Estoy desarrollando una aplicación en la que necesito actualizar cierta información cada vez que el usuario inicia sesión en el sistema, también uso la base de datos en el teléfono. Para todas esas operaciones (actualizaciones, recuperación de datos de db, etc.) utilizo tareas asíncronas. Como hasta ahora, no vi por qué no debería usarlos, pero recientemente experimenté que si hago algunas operaciones, algunas de mis tareas asíncronas simplemente se detienen en la ejecución previa y no saltan a doInBackground. Eso fue demasiado extraño para dejarlo así, así que desarrollé otra aplicación simple solo para verificar qué estaba mal. Y por extraño que parezca, obtengo el mismo comportamiento cuando el recuento de tareas asíncronas totales llega a 5, el sexto se detiene en la ejecución previa.
¿Android tiene un límite de asyncTasks en Actividad / Aplicación? ¿O es solo un error y debería informarse? ¿Alguien experimentó el mismo problema y tal vez encontró una solución?
Aquí está el código:
Simplemente cree 5 de esos hilos para trabajar en segundo plano:
private class LongAsync extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute()
{
Log.d("TestBug","onPreExecute");
isRunning = true;
}
@Override
protected String doInBackground(String... params)
{
Log.d("TestBug","doInBackground");
while (isRunning)
{
}
return null;
}
@Override
protected void onPostExecute(String result)
{
Log.d("TestBug","onPostExecute");
}
}
Y luego crea este hilo. Entrará en preExecute y se colgará (no irá a doInBackground).
private class TestBug extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute()
{
Log.d("TestBug","onPreExecute");
waiting = new ProgressDialog(TestActivity.this);
waiting.setMessage("Loading data");
waiting.setIndeterminate(true);
waiting.setCancelable(true);
waiting.show();
}
@Override
protected String doInBackground(String... params)
{
Log.d("TestBug","doInBackground");
return null;
}
@Override
protected void onPostExecute(String result)
{
waiting.cancel();
Log.d("TestBug","onPostExecute");
}
}
fuente
core pool size
omaximum pool size
?@antonyt tiene la respuesta correcta, pero en caso de que esté buscando una solución simple, puede consultar Needle.
Con él, puede definir un tamaño de grupo de subprocesos personalizado y, a diferencia
AsyncTask
, funciona en todas las versiones de Android por igual. Con él puedes decir cosas como:o cosas como
Puede hacer mucho más. Compruébalo en GitHub .
fuente
Actualización : desde API 19, el tamaño del grupo de subprocesos centrales se cambió para reflejar la cantidad de CPU en el dispositivo, con un mínimo de 2 y un máximo de 4 al inicio, mientras crece hasta un máximo de CPU * 2 +1 - Referencia
También tenga en cuenta que si bien el ejecutor predeterminado de AsyncTask es serial (ejecuta una tarea a la vez y en el orden en que llegan), con el método
puede proporcionar un ejecutor para ejecutar sus tareas. Puede proporcionar THREAD_POOL_EXECUTOR el ejecutor bajo el capó pero sin serialización de tareas, o incluso puede crear su propio Ejecutor y proporcionarlo aquí. Sin embargo, tenga en cuenta la advertencia en los Javadocs.
Una cosa más a tener en cuenta es que tanto el marco proporcionado Executors THREAD_POOL_EXECUTOR como su versión serial SERIAL_EXECUTOR (que es predeterminada para AsyncTask) son estáticos (construcciones de nivel de clase) y, por lo tanto, se comparten en todas las instancias de AsyncTask en el proceso de su aplicación.
fuente