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");
}
}
la source
core pool size
oumaximum pool size
?@antonyt a la bonne réponse, mais au cas où vous cherchez une solution simple, vous pouvez consulter Needle.
Avec lui, vous pouvez définir une taille de pool de threads personnalisée et, contrairement à
AsyncTask
, cela fonctionne de la même manière sur toutes les versions d'Android. Avec lui, vous pouvez dire des choses comme:ou des choses comme
Cela peut faire bien plus. Découvrez-le sur GitHub .
la source
Mise à jour : depuis l'API 19, la taille du pool de threads de base a été modifiée pour refléter le nombre de processeurs sur l'appareil, avec un minimum de 2 et un maximum de 4 au démarrage, tout en augmentant jusqu'à un maximum de CPU * 2 +1 - Référence
Notez également que si l'exécuteur par défaut d'AsyncTask est série (exécute une tâche à la fois et dans l'ordre dans lequel elles arrivent), avec la méthode
vous pouvez fournir un exécuteur pour exécuter vos tâches. Vous pouvez fournir le THREAD_POOL_EXECUTOR à l'exécuteur sous le capot, mais sans sérialisation des tâches, ou vous pouvez même créer votre propre exécuteur et le fournir ici. Cependant, notez attentivement l'avertissement dans les Javadocs.
Une autre chose à noter est que le framework fourni Executors THREAD_POOL_EXECUTOR et sa version série SERIAL_EXECUTOR (qui est par défaut pour AsyncTask) sont statiques (constructions au niveau de la classe) et donc partagés entre toutes les instances d'AsyncTask (s) à travers votre processus d'application.
la source