Предисловие
На самом деле, мне очень повезло. Недавно я был занят с возможностью обобщения.
принцип
Принципы загрузки изображений в ListView или GridView в основном одинаковы:
Получите его из кеша памяти и верните его.
Блок -схема следующая:
В то же время обратите внимание на количество потоков. Как правило, загружая изображения в ListView, все открывают новые потоки для загрузки, но когда они быстро скользят, их легко вызвать, поэтому необходимо контролировать количество потоков. Мы можем контролировать количество потоков через пул потоков.
Метод установления пула потоков выглядит следующим образом:
Executorservice executorservice = executors.netfixedthreadpool (5);
Класс файлов кэша
Импорт java.io.file; OS.Environment.getExternalStorageState (). ) {cachedir.mkders ();}} public file getFile (string url) {// идентифицировать изображения с помощью хэш -кода url. ; Класс кэша памяти
Вот мягкая ссылка, Map <String, Softreference <Bitmap >> Кэш, вы можете Google в мягкий эталон.
Import Java.Lang.Ref.softrefere; Коллекции Ref.get ();} public void put (string id, растровый растровый карта) {cache.put (id, new softreference <bit map> (bitmap);} public void clear () {cache.clear ();}}Класс загрузки картинки
Импорт Java.io.file; Util.collection; .Bitmapfactory; Кэш изображения * / memoryCache MemoryCache = New MemoryCache (); SynchrysedMap (New SleedHashmap <ImageView, String, String> ()); {Filecache = New Filecache (Context) ;; Изображение из кэша памяти imageView.setImageBitmap (bitmap);} else {// отображение из кэша файла или сети Queuephoto (url, imagev Iew);}} private void queePoto (string url, imageView) {phototoLoad = new PhotoLoad (url, imageView) {phototoLoad = new PhototoLoad (url, ImageView) , ImageView); {Return bmp;} // Сетевой Try {Bitmap Bitmap = null; (true); {if (exstanceOf uTOFMemoryError) {clearCache ();} private void copystream (inputStream IS, outputStream OS) {int buffer_size = 1024; .read (Bytes, 0, Buffer_size); F) {try {// todo: сжатие размера изображения fileInputStream = new FileInputStream (f); {MemoryCache.clear (); URL, ImageView ImageView) {this.url = url; ) {This.phototoload = phototoload;} private boolean imageviewused (фототолога PhotoLoad) {String Tag = ImageViews.get (phototoload.im.im.im.im.im.im.im.im Ageview); ||! Tag.Equals (phototoload.url)) {return true;} return false;} @Override public void run () {// прервать текущий поток, если IM Age View повторно Bitmap Bitmap = getBitmap (photoLoad.url); Bitmapdisplayer (Bitmap, Photoloal); @Override public void run () {if (imageViewRidessuess (phototoload)) {return;} if (bitmap! = Null) oad.imageview.setimagebitmap (bitmap);} else {phototoload.imageview.setimagerSource (default_bg);}}}}}}}}}}}} }}Метод вызова
ImageLoader ImageLoader = new ImageLoader (контекст);