Avant-propos
En fait, je suis très chanceux. Récemment, j'ai été occupée par une chance de résumer.
principe
Les principes de chargement des images dans ListView ou GridView sont fondamentalement les mêmes:
Obtenez-le à partir du cache de mémoire et renvoyez-le.
L'organigramme est le suivant:
Dans le même temps, faites attention au nombre de fils. Généralement, le chargement des images dans ListView, tout le monde ouvre de nouveaux threads à charger, mais lorsqu'il glisse rapidement, il est facile de provoquer l'OOM, de sorte que le nombre de threads doit être contrôlé. Nous pouvons contrôler le nombre de threads via le pool de threads.
La méthode d'établissement d'un pool de threads est la suivante:
ExecutorService ExecutorService = exécutor.NetFixEdThreadPool (5);
Classe de cache de fichier
Importer java.io.file; OS.environment.getExternalStorAgestate (). ) {cachedir.mkders ();}} public file getFile (string url) {// identifier les images par code hachage d'URL fileName = string.valueof (url.hashcode ()); ; Classe de cache de mémoire
Voici une référence douce, map <string, softreference <bitmap >> Cache, vous pouvez Google sur un mécanisme de référence doux.
Importation java.lang.ref.softreference; Collections. Ref.get ();} public void put (String id, bitmap bitmap) {cache.put (id, new softreference <bit map> (bitmap);} public void clear () {cache.clear ();}}Classe de chargement d'image
Importation Java.io.File; util.Collections; .Bitmapfactory; Image Cache * / MemoryCache MemoryCache = new MemoryCache (); SynchronizedMap (nouveau FaiblehashMap <ImageView, String, String> ()); {filecache = new FileCache (contexte) ;; Image de la mémoire cache imageView.SetImageBitmap (bitmap);} else {// afficher à partir de cache de fichier ou de réseau de réseau (URL, imagev iew);}} private void queuePhoto (String url, imageView , ImageView); {Return bmp;} // de réseau essai (TRUE); {if (exsanceof outofMemoryError) {clearcache ();} private void copyStream (inputStream is, outputStream os) {int buffer_size = 1024; .read (bytes, 0, buffer_size); F) {try {// too: compress image size fileInputStream = new FileInputStream (f); {MemoryCache.CLear (); URL, ImageView ImageView) {this.url = url; ) {This.phototoload = phototoload;} booléen privé ImageViewReused (Phototoload Photoload) {String Tag = ImageViews.get (Phototoload.im.im.im.im.im.im.im.im AgeView); ||!! Bitmap bitmap = getBitmap (phototoload.url); BitmapDisplayer (bitmap, phototoload); @Override public void run () {if (imageViewReUsed (phototoload)) {return;} if (bitmap! = Null) oad.imageview.setimagebitmap (bitmap);} else {phototoload.imageview.setImageResource (defaun_bg);}}} }}Méthode d'appel
ImageLoader ImageLoader = new ImageLoader (contexte);