AsyncTask: doInBackground non appelé
J'ai un problème avec le AsyncTask
. Parfois, le doInBackground()
méthode n'est pas appelée après onPreExecute()
.
Je sais que cette question a été posée plusieurs fois, mais les réponses données ne fonctionnent pas pour moi.
Voici une partie de mon code:
AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>(){
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.e("AsyncTask", "onPreExecute");
}
@Override
protected Void doInBackground(Void... params) {
Log.e("AsyncTask", "doInBackground");
return null;
}
protected void onPostExecute(Void result) {
Log.e("AsyncTask", "onPostExecute");
};
};
if(Build.VERSION.SDK_INT >= 11)
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
else
asyncTask.execute();
Comme vous pouvez le voir, j'ai vérifier si la version d'Android est >= Nid d'abeille et d'exécuter la tâche dans la Piscine de l'Exécuteur testamentaire, si c'est vrai.
Même avec ce "truc" parfois doInBackground()
n'est pas appelé.
Est-ce que qqn ont le même problème ou sait comment, quel est le problème?
Merci
source d'informationauteur Valentin
Vous devez vous connecter pour publier un commentaire.
Finalement j'ai trouvé une solution à ce problème.
Au lieu d'exécuter l'asyncTask avec l' *AsyncTask.THREAD_POOL_EXECUTOR*, je instancier mon propre ThreadPoolExecutor avec un grand corePoolSize et maximumPoolSize:
Et ...
Je ne sais pas si c'est une bonne correction, mais avec cela, doInBackground() est toujours appelé.
Comme vous l'avez dit, je supose que le problème était que *AsyncTask.THREAD_POOL_EXECUTOR* ne pouvait pas gérer autant de asyncTasks que j'ai donné.
Merci les gars
Il m'est arrivé une seule fois parce que certains de mes tâches ont été bloqués dans la
doInBackground()
(ce qui est évidemment impossible avec l'exemple de code que vous avez collé).La valeur par défaut de la taille du pool sur Android pour THREAD_POOL_EXECUTOR était de 5 la dernière fois que j'ai vérifié. Donc, si vous exécutez plus de 5 tâches en même temps le côté va attendre jusqu'à ce qu'une tâche est terminée.
C'est le seul cas où je connus pour empêcher un
doInBackground()
appel.Votre code semble correct.
Vous pouvez uniquement exécuter async tâches à la fois. Je devine que vous essayez d'exécuter plusieurs fois.
Créer une autre instance et essayez à nouveau.
Si ça ne fonctionne pas, vérifiez le logcat et le poster ici si c'est pas assez pour vous permettre de les corriger.