2013-01-09 11 views
11

Sto lavorando su un'applicazione Android. Ho un'attività che contiene una vista elenco.Gli oggetti Listview rimuovono i bitmap dalla memoria quando l'utente scorre

La visualizzazione elenco contiene molti elementi e ciascuno contiene un'immagine bitmap.

Poiché l'elenco è molto grande e contiene molte immagini, durante l'operazione di caricamento delle bitmap viene generato e esaurito l'errore di memoria su alcuni vecchi dispositivi.

quindi sono alla ricerca di un modo per effettuare le seguenti operazioni per i vecchi dispositivi:

  • Caricare le bitmap per gli articoli che sono nella vista (o vicino ad esso)
  • quando l'utente scorre verso il basso I caricare i bitmap che dovrebbero apparire a lui e rimuovere i bitmap che sono ora nascosti.
  • Quindi in qualsiasi momento solo le immagini nella vista (o nelle vicinanze) vengono caricate nell'heap mentre le altre vengono rimosse quando non sono più nella vista.

C'è un modo per farlo?

Ulteriori informazioni:

ho seguito ogni istruzioni e il codice su come caricare immagini bitmap in modo efficiente (sulla documentazione Android e su qualsiasi sito che ho potuto trovare), ho anche fatto in modo che non c'è memoria perdite, ricicla ogni bitmap e mi assicuro che il GC funzioni correttamente e, infine, su vecchi dispositivi ho reso la risoluzione delle immagini il più piccola possibile. Ma la dimensione dell'elenco sta causando l'esaurimento della memoria ancora su alcuni dispositivi.

Quindi sto cercando di sapere se posso fare la soluzione proposta sopra.

Grazie mille per tutto l'aiuto

+0

Hai provato a implementare il modello View Holder? –

risposta

11

Si dovrebbe prendere in considerazione guardando Esempio Galleria App da Google I/O 2012. Tutto ciò che serve è implementato lì.

Video from Google I/O about gallery app

codice sorgente è disponibile su Google Code ed è un esempio exclellent di costruzione di una galleria. Dovresti anche considerare di guardare lo presentation (inizio) di Romain Guy in cui spiega i problemi di prestazioni con ListView e insegna ad usare gli adattatori in modo efficiente. (Visualizza modello di copertina e riutilizzo di viste).

Ecco un RecycleListener per GridView (disponibile dal livello API 1). Un RecyclerListener viene utilizzato per ricevere una notifica ogni volta che una vista viene posizionata all'interno dell'heap di scrap di RecycleBin. Questo listener viene utilizzato per liberare le risorse associate alle Visualizzazioni collocate in RecycleBin.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.album); 

    mAdapter = new PhotoAdapter(this); 

    mGridView = (GridView) findViewById(android.R.id.list); 
    mGridView.setAdapter(mAdapter); 

    mGridView.setRecyclerListener(new RecyclerListener() { 
     @Override 
     public void onMovedToScrapHeap(View view) { 
      // Release strong reference when a view is recycled 
      final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon); 
      imageView.setImageBitmap(null); 
     } 
    }); 

    // Kick off loader for Cursor with list of photos 
    getLoaderManager().initLoader(LOADER_CURSOR, null, mCursorCallbacks); 
} 
+0

grazie mille! – kaitian521

0

Vuoi cercare alcuni tutorial ed esempi di 'lazy loading'.
Un possibile esempio potrebbe essere: https://github.com/thest1/LazyList

+1

Potrei sbagliarmi, ma non caricare pigro solo per caricare le immagini man mano che appaiono ma senza rimuovere quello già caricato? – Youssef

+0

Dipende dall'implementazione. Forse il caricamento pigro di default è come lo descrivi, ma so per certo che l'esempio fornito non lo è. Puoi vederlo (e molte altre grandi librerie) lavorando nell'app dei pattern UI: https://play.google.com/store/apps/details?id=com.groidify.uipatterns –

0

Utilizzando una libreria come Universal Image Loader ti dà opzioni per la memorizzazione nella cache le immagini e la gestione della memoria. Dovresti essere in grado di impostare una dimensione massima della cache e si occupa anche del caricamento delle immagini su un thread in background.

ListView si occupa di riciclare le viste in cui si inseriscono le immagini e di semplificare la memoria a tale riguardo.

+0

Potrebbe funzionare anche Picasso. –

Problemi correlati