2012-12-02 6 views
6

Sto lavorando ad un progetto Android, nel quale ho bisogno di caricare alcune immagini su GridView. Le immagini potrebbero essere nella cache, se manca la cache, quindi eseguire una query sul server Internet. Il mio progetto è quello di utilizzare due thread per eseguire l'attività di caricamento. Un thread per leggere la cache e un thread per il download. Quindi ci sono 3 thread tra cui quello dell'interfaccia utente. Ognuno di loro ha una propria coda di messaggi e usa Handler per comunicare.Se un servizio associato o thread personalizzati quando si esegue il download di qualcosa?

La mia domanda è se, invece, dovrei utilizzare il servizio associato in questa situazione? In realtà ho realizzato il disegno sopra e non sembra nulla di sbagliato, ma GC sta lavorando molto duramente, il che può essere dedotto dal logcat.

Un altro problema è che esistono numerosi thread quando utilizzo DDMS per monitorare i thread. Questo perché lo stesso meccanismo di caricamento è utilizzato in diverse attività. Ho lasciato che i thread abbandonassero il loro ciclo di messaggi mentre onPause() è chiamato, sono sicuro che solo due di loro sono vivi nello stesso tempo. Ma posso vederli tutti in DDMS. (A proposito, perché i thread esistono ancora? Ho lasciato thread = null;)

Quindi, in una parola, la mia domanda è: questa attività di caricamento può trarre vantaggio da un servizio associato?

risposta

1

Quindi, perché si utilizzano più thread? Devi caricare un'immagine in background e, al termine, visualizzarla nell'interfaccia utente. Non importa l'interfaccia utente da cui provengono le immagini. E l'utilizzo di più thread non lo rende più veloce, ma consuma più memoria. Basta usare un singolo thread in background: prima tocca la cache, quindi scarica se non c'è hit.

I servizi sono per quando si desidera eseguire qualcosa che non ha bisogno di un'interfaccia utente. Se è necessario aggiornare l'interfaccia utente in tempo reale, un servizio non ha molto senso.

+0

Grazie per la risposta. Ma un thread in background per la memorizzazione nella cache e il download non è sufficiente. In questo modo, un'immagine nella cache non verrà caricata fino al completamento delle attività di download precedenti. Nella progettazione a due sfondi, un'immagine potrebbe essere caricata il prima possibile se si trova nella cache. Per quanto ne so, "Bound Service" può essere usato per comunicare con l'attività. Questa comunicazione può essere bilaterale, quindi teoricamente un servizio vincolato si applica a questa situazione. Ma quello che mi chiedo è se il servizio associato è più efficiente. – Alley003

+0

Un servizio non è affatto speciale: se si desidera che esegua thread, è necessario crearli. Per il tuo caso, potresti volere più thread di caricamento (ma legati) in modo da ottenere le cose più velocemente. Ci sono librerie open source che fanno questo, e IIRC ci sono alcuni esempi nel codice AOSP. In ogni caso, un servizio non è cosa da usare qui. –

+0

Eccone uno molto buono: https://github.com/novoda/ImageLoader. Se controlli la fonte vedrai che questo non è banale, e potresti voler usare una libreria invece di provare a reinventarla. –

Problemi correlati