Prefácio
Na verdade, tenho muita sorte. Recentemente, tenho estado ocupado com a chance de resumir.
princípio
Os princípios de carregar imagens no ListView ou GridView são basicamente os mesmos:
Obtenha -o no cache de memória e retorne -o.
O fluxograma é o seguinte:
Ao mesmo tempo, preste atenção ao número de threads. Geralmente, carregando imagens no ListView, todos abrem novos threads para carregar, mas quando está deslizando rapidamente, é fácil causar OOM; portanto, o número de threads precisa ser controlado. Podemos controlar o número de threads através do pool de threads.
O método de estabelecer um pool de threads é o seguinte:
ExecutorService ExecutorService = Executores.NetfixedThreadpool (5);
Classe de cache do arquivo
Importar java.io.File; OS.Environment.GetexternalStoraGestate (). ) {Cachedir.mkders ();}} public arquivo getfile (string url) {// identifique imagens por hash da URL String filename = string.valueof (url.hashcode ()); Retornar f;} public void clear () {arquivos = cachedir.listfiles (); Classe de cache de memória
Aqui está uma referência suave, mapa <string, softreference <bitmap>> cache, você pode pesquisar no Google para um mecanismo de referência suave.
Importar java.lang.ref.softreference; Coleções Ref.get ();} public void put (string id, bitmap bitmap) {cache.put (id, new softreference <bit map> (bitmap);} public void clear () {cache.clear ();}}Classe de carregamento de imagem
Importar Java.io.File; Util.Collection; .BitmapFactory; Cache de imagem * / MemoryCache MemoryCache = new MemoryCache (); SynchronizedMap (novo e fraco, string, string> (); {filecache = novo FileCache (contexto); Imagem de Memory Cache ImageView.SetImageBitMap (Bitmap);} else {// Exibir do cache de arquivos ou rede queuephoto (url, imagev iew);}} private void queuephoto (URL da string, imagem ImageView) {Phototoload Phototoload = New PhotoTolOad (Url , ImageView); {Return bmp;} // de rede {bitmap bitmap = null; (verdadeiro); {if (exstância de outfmemoryerror) {clearcache ();} private void copyStream (InputStream é, outputStream OS) {int buffer_size = 1024; .read (bytes, 0, buffer_size); F) {tente {// TODO: compactar tamanho FileInputStream = new FileInputStream (f); {Memorycache.clear (); URL, ImageView ViewView) {this.url = url; ) {This.phototoload = fototoload;} Private Boolean ImageViewReused (Phototoload Photoload) {string tag = imageviews.get (phototoload.im.im.im.im.im.im.im.im.imeview); ||! bitmap bitmap = getbitmap (fototoload.url); Bitmapdisplayer (Bitmap, PhotoToload); Handler.post (BD);} Class Bitmapdisplayer IMPLEMENTS Runnable {BI TMAP BITMAP; PhotoToload PhotoToload; Public Bitmapdisplayer (bitmap bitmap, Photoload PhotoLoad) {this.bitmap = bitmap; this. PhotoLoad = PHOTOTOLOAD;} @Override public void run () {if (ImageViewReUsed (Phototoload)) {return;} if (bitmap! = Null) oad.imageView.setImageBitMap (bitmap);} else {Phototoload.imageView.setImagerEsource (default_bg); }}Método de chamada
Imageloader imageloader = novo imageloader (contexto);