2015-02-04 13 views
6

Sto usando UIL (per Nosotra) per scaricare le immagini che il server esegue il rendering e il server impiega fino a 50 secondi per creare ogni immagine. Il timeout del server è impostato su 15 secondi, quindi abbiamo creato un meccanismo di polling implementato nel metodo ImageDownloader.getStream(). Dopo il download, le immagini vengono visualizzate in un ViewPager (android.support.v4.view.ViewPager, proprio come il sample fa.)Utilizzo di Android-UIL, come interrompere il download?

Quando gli utenti a navigare ad altre pagine, vorrei fermare il polling senza scaricare i file, ma sembra che non c'è "bello "modo per interrompere il flusso di download.

GetStream pseudo-codice

1. Parse custom-style URI ("asdf://mypng|123455678945643563245"); 
2. Make a real world URL from it. 
3. Poll the server for the image url (causes the server to render - could take up to 1m30s). 
4. Get the stream from the URL, return the stream to caller. 
     Example Code: InputStream is = (InputStream) url.getContent(); 

cosa ha provato finora

Tornando null dal mio metodo getStream causa un NullPointerException per essere gettato, quindi è praticamente uguale a un semplice lancio di un eccezione.

quando viene generata un'eccezione, l'immagine non si ferma, ma:

  1. Alcune immagini tardi, ottengo un OutOfMemoryError, quindi mostro un errore sullo schermo. Non dovrei ottenere l'errore. Ho già provato this SO question's checklist, ma non ha funzionato. OOM Stacktrace: OutOfMemoryError stacktrace nostra uil
  2. Il download si arresta e, se il viewer non ricicla la vista, quando si torna a quella pagina, vedrò comunque quella pagina di errore (nessun tentativo).

Quello che desidero

desidero per me avere un metodo di "attesa" che dovrebbe aggiungere fermare il download corrente e ri-aggiungere una nuova attività alla fine della coda (attualmente sul set su un QueueProcessingType.LIFO e desidero scaricare il numero aggiunto dopo il dopo le pagine correnti e qualsiasi nuova pagina che l'utente desidera dovrebbe avere la precedenza su quelle aggiunte nuovamente.

Vorrei anche accontentarmi di evitare lo OutOfMemoryError.

Per favore aiuto.

+1

Vedere anche [questo problema] (https://github.com/nostra13/Android-Universal-Image-Loader/issues/903) sul GitHub del progetto. – Felix

+0

Sei sicuro che la tua app non abbia perdite di memoria? – NOSTRA

+0

Fino ad ora, non ne abbiamo notato nessuno, e il problema si verifica solo quando si utilizzano le visualizzazioni di pagina. – Felix

risposta

1

Il problema potrebbe essere qui 4. Scarica l'immagine, restituisci il flusso. Download: è la caratteristica principale di UIL. Basta restituire NetworkStream qui. Inoltre avevo OOM su UIL con immagini grandi e MemoryCache abilitato. Anche quale dimensione dell'immagine hai sul server. in caricamento del metodo Image hai il controllo su Size. Anche così utile UIL GitHub per favore leggi 3 e 4 paragrafo.

+0

Scusa, probabilmente ti ho buttato via, quindi ho modificato meglio lo pseudocodice. Ho letto p3 e p4 su quel github - l'OOM è meno importante, ho pensato che fosse un effetto collaterale del lancio di un'eccezione mid-getStream(). – Felix

+2

Ho usato per scaricare immagini da AWS di Elastic Transcoder, quindi un comportamento come il tuo. stavo restituendo null da getStream. Funziona ancora. Ha appena avvisato dai log UIL. Puoi anche fingere java doc su questo metodo https://github.com/nostra13/Android-Universal-Image-Loader/blob/master/library/src/main/java/com/nostra13/universalimageloader/core/download/ImageDownloader .java genera IOException se si verifica un errore I/O durante il flusso di immagini genera UnsupportedOperationException se l'URI dell'immagine ha schema (protocollo) non supportato – TAC