2012-06-12 4 views
4

J'ai une application qui utilise beaucoup d'AsyncTasks, le problème que j'ai est qu'une tâche particulièrement importante n'est pas démarrée pendant quelques minutes après que j'appelle exécuter. Si j'utilise ce qui suit pour mes périphériques ICS, cela fonctionne;Android AsyncTask n'étant pas appelé pour les minutes sur ICS

if(Build.VERSION.SDK_INT >= 11) 
{ 
    myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, stuff); 
} 

par opposition à ceci sur pré-ICS;

myTask.execute(stuff); 

Je suis conscient que ICS a changé d'exécution de fil à sérialisé, mais je ne peux pas comprendre ce qui retient la file d'attente de fil.

Il y a environ 20 threads listés dans debug dans eclipse, mais j'ai lu que c'est peut-être incorrect car le débogueur a tendance à continuer à afficher ceux qui ne sont pas vraiment là. Comment puis-je déterminer quels threads bloquent la file d'attente sérialisée afin de ne pas avoir à passer de la valeur par défaut sur ICS, et peut-être même améliorer les performances des périphériques pré-ICS qui ne voient pas les problèmes dus à l'exécuteur du pool de threads est le comportement par défaut.

+0

Veuillez ne pas corriger mon anglais britannique en anglais américain, et certainement ne pas ajouter plus d'erreurs typographiques. : D – Hamid

+0

Est-ce que le démarrage dure toujours le même temps ou varie-t-il? – ghostbust555

+0

il est varié, parfois il va s'exécuter instantanément, comme prévu, d'autres je vais devoir attendre quelques minutes. Bien qu'il ne semble pas y avoir d'entre-deux, il s'agit de minutes instantanées ou x (non comptabilisées). – Hamid

Répondre

3

Comment puis-je déterminer quels fils tiennent la file d'attente sérialisée

Ajouter Log instructions pour suivre l'entrée et la sortie des doInBackground() pertinentes méthodes.

et peut-être même d'améliorer les performances des périphériques pré-ICS qui ne voient pas les problèmes dus au comportement par défaut de l'exécuteur du pool de threads.

Vous n'avez pas besoin d'utiliser AsyncTask. Il suffit de taper votre propre fil et d'utiliser des trucs comme runOnUiThread() comme moyen d'exécuter une logique sur le fil d'application principal. AsyncTask est une commodité, pas une exigence. Et, pour une tâche hautement prioritaire aberrante, il peut être plus judicieux de garder cela à l'écart de tout conflit de pool de threads. Ou, clonez et tapez AsyncTask pour utiliser PriorityQueue, afin de pouvoir indiquer explicitement vos tâches hautement prioritaires.

+0

Merci CW, je vais mettre ça à l'épreuve. – Hamid

+0

Cela m'a certainement aidé à comprendre la cause, il semble que l'un de mes AsyncTasks faisant des communications avec un DefaultHttpClient ne se termine pas depuis longtemps. J'ai une connexion et des délais d'attente de socket définis sur ce client, donc je ne peux pas comprendre ce qui retarde la tâche, les délais brefs, une ou deux secondes. En outre, il semble ne le faire que sur le HTC Sensation avec ICS 4.0.3, le test sur un Galaxy S2 4.0.3 fonctionne très bien. – Hamid

Questions connexes