Question

Je suis aller chercher beaucoup de vignettes à partir d'un serveur distant et de les afficher dans une vue de la grille, en utilisant AsyncTask. Le problème est, mon point de vue de la grille affiche 20 vignettes à la fois, qui crée 20 AsyncTasks et commence à 20, un par exécute miniature.

Je reçois exception RejectedExecution dans mon code. Je me souviens avoir lu quelque part qu'il ya une limite au nombre de tâches AsyncTask peut avoir à la fois dans sa file d'attente, je pourrais être frappais que. Est-ce bar levé?

Y at-il un moyen d'augmenter cette limite? Est-il sûr d'ignorer cette exception? (En ayant un bloc catch(RejectedException e){} vide?)

Je courais ce code sur émulateur Android 1.6 et le niveau de l'API dans mon code (minSDKVersion est 3). [EDIT: SDK et informations Ajouté niveau de l'API]

Était-ce utile?

La solution

  

Je me souviens avoir lu quelque part qu'il y   est une limite au nombre de tâches   AsyncTask peut avoir dans sa file d'attente à un   temps, je pourrais être que frapper. Était   cette barre levée?

AsyncTask semble soutenir actuellement 10 fils et une profondeur de file d'attente de travail de 10. En théorie, qui soutiendrait seulement 20 articles ... si rien d'autre utilise AsyncTask.

  

Y at-il un moyen d'augmenter cette limite?

Saisir le code source, le modifier, le mettre dans votre propre paquet, et utiliser celui-ci. Je l'ai fait avec mon AsyncTaskEx , mais qui est basé sur la source 1.5 Android.

  

Est-il sûr d'ignorer cette   exception?

Votre travail ne sera pas mis en attente pour l'exécution. Que ce soit « sûr » est à vous. Je ne suis pas au courant d'autres impacts sur l'infrastructure AsyncTask.

Autres conseils

Je l'ai fait exactement la même chose moi-même dans une application.

Lancement de 20 fils parallèles à la fois pour télécharger des vignettes à partir d'un serveur et les pousser à un adaptateur de données ne semble pas être une bonne idée pour moi. Tous ces sujets vont simplement déclencher tous les uns sur les autres et obtenir de la manière de l'autre.

Au lieu de cela, je lancer un seul fil, il a recueillir les vignettes dans une boucle, et les ajouter à l'adaptateur à leur arrivée.

Vous pouvez utiliser l'exécuteur testamentaire de série avec AsyncTask.executeOnExecutor, pour sérialiser vos tâches, mais qui limitera la tâche à une seule tâche concurrente à l'époque. Peut-être bien que lors de l'obtention des vignettes:

myAsyncTask.executeOnExecutor (MyAsyncTask.SERIAL_EXECUTOR, [params]);

Le problème est que le nombre de en attente AsyncTasks pour AsyncTask.THREAD_POOL_EXECUTOR est 128. Une fois que la file d'attente est rempli aucun nouveau AsyncTasks peut être mis en attente.

De AsyncTask code source:

private static final BlockingQueue<Runnable> sPoolWorkQueue =
        new LinkedBlockingQueue<Runnable>(128);

À mon avis cette limite n'a absolument aucun sens et AsyncTask.SERIAL_EXECUTOR a une file d'attente illimitée.

« Safe » pour ignorer - Vous devez vous assurer que tout type de notification que vous aviez l'intention de faire en sera fait après l'exécution ici quand vous attrapez l'erreur - sinon vous risquez de laisser quelque chose traîner si votre autre code fait des hypothèses sur l'audition de retour de cette tâche.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top