Je développe une application dans laquelle je dois mettre à jour certaines informations chaque fois que l'utilisateur se connecte au système, j'utilise également la base de données du téléphone. Pour toutes ces opérations (mises à jour, récupération de données à partir de la base de données, etc.), j'utilise des tâches asynchrones. Comme jusqu'à présent, je n'ai pas vu pourquoi je ne devrais pas les utiliser, mais récemment, j'ai constaté que si je fais certaines opérations, certaines de mes tâches asynchrones s'arrêtent simplement lors de la pré-exécution et ne sautent pas à doInBackground. C'était juste trop étrange pour le laisser comme ça, alors j'ai développé une autre application simple juste pour vérifier ce qui ne va pas. Et assez étrange, j'obtiens le même comportement lorsque le nombre total de tâches asynchrones atteint 5, le 6ème s'arrête lors de la pré-exécution.
Android a-t-il une limite d'AsyncTasks sur l'activité / l'application? Ou est-ce juste un bug et il devrait être signalé? Quelqu'un a-t-il rencontré le même problème et a peut-être trouvé une solution de contournement?
Voici le code:
Créez simplement 5 de ces threads pour travailler en arrière-plan:
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");
}
}
Et puis créez ce fil. Il entrera preExecute et se bloquera (il n'ira pas à 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");
}
}