Domanda

Io sono il recupero sacco di miniature da un server remoto e di inserirli in una visualizzazione a griglia, utilizzando AsyncTask. Il problema è, la mia vista griglia visualizza 20 miniature in un momento, in modo che crea 20 AsyncTasks e inizia 20 esegue, uno per ogni miniatura.

ottengo un'eccezione RejectedExecution nel mio codice. Ricordo di aver letto da qualche parte che c'è un limite al numero di attività che AsyncTask può avere in coda alla volta, potrei essere colpire quel. È stato sollevato questo bar?

C'è un modo per aumentare questo limite? E 'sicuro di ignorare semplicemente questa eccezione? (Avendo un blocco catch(RejectedException e){} vuoto?)

Sono in esecuzione di questo codice su Android 1.6 emulatore e il livello di API nel mio codice (minSDKVersion è 3). [EDIT: Aggiunto SDK e API di livello info]

È stato utile?

Soluzione

  

Ricordo di aver letto da qualche parte che ci   è un limite al numero di attività che   AsyncTask può avere nella sua coda in un   tempo, potrei essere colpire questo. Era   questo bar sollevato?

appare AsyncTask per sostenere attualmente 10 fili e una profondità di coda di lavoro 10. In teoria, che sarebbe solo supporto 20 articoli ... se non altro sta usando AsyncTask.

  

C'è un modo per aumentare questo limite?

Afferra il codice sorgente, modificarlo, metterlo nel proprio pacchetto, e l'uso che uno. Ho fatto questo con il mio AsyncTaskEx , anche se questo si basa sul Android 1.5 di origine.

  

E 'sicuro basta ignorare questo   eccezione?

Il vostro lavoro non sarà in coda per l'esecuzione. Se ciò sia "sicuro" è a voi. Non sono a conoscenza di eventuali altri impatti sull'infrastruttura AsyncTask.

Altri suggerimenti

Ho fatto la stessa cosa esattamente me stesso in un'applicazione.

Il lancio 20 thread paralleli subito a scaricare le miniature da un server e spingerli ad un adattatore di dati non suona come una buona idea per me. Tutti quei fili sarà solo inciampare in tutto l'altro e ottenere in maniera reciproca.

Invece, vorrei lanciare un solo filo, farlo raccogliere le miniature in un ciclo, e aggiungerli alla scheda man mano che arrivano.

È possibile utilizzare l'esecutore seriale con AsyncTask.executeOnExecutor, per serializzare le attività, ma che limiterà il compito di un solo compito concomitante al momento. Potrebbe essere buono anche se quando ottiene le miniature:

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

Il problema è che il numero di in attesa AsyncTasks per AsyncTask.THREAD_POOL_EXECUTOR è 128. Una volta che la coda si riempie nessuna nuova AsyncTasks possono essere messi in coda.

Da codice sorgente AsyncTask:

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

A mio parere tale limite non ha assolutamente senso a tutti e AsyncTask.SERIAL_EXECUTOR ha una coda illimitata.

"Safe" per ignorare - È necessario fare in modo che qualsiasi tipo di notifica che si stavano progettando di fare nel post-esecuzione sarà fatto qui quando si cattura l'errore - altrimenti si potrebbe lasciare qualcosa appeso se l'altro codice rende ipotesi di sentire indietro da questo compito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top