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 une base de données dans le téléphone. Pour toutes ces opérations (mises à jour, récupération de données dans la base de données, etc.), j'utilise des tâches asynchrones. Jusqu'à présent, je ne voyais pas pourquoi je ne devais pas les utiliser, mais récemment, j'ai constaté que si je faisais certaines opérations, certaines de mes tâches asynchrones s'arrêtaient tout simplement en pré-exécution et ne passaient pas à doInBackground. C'était 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 étrangement, j'obtiens le même comportement lorsque le nombre total de tâches asynchrones atteint 5, la 6ème s'arrête lors du pre-execute.
Est-ce qu'Android a une limite d'asyncTasks sur une activité/application ? Ou s'agit-il simplement d'un bug qu'il faut signaler ? Est-ce que quelqu'un a rencontré le même problème et a peut-être trouvé une solution de contournement ?
Voici le code :
Il suffit de créer 5 de ces fils 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 ensuite créer ce fil. Il entrera dans preExecute et se suspendra (il ne passera 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");
}
}