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");
}
}