亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

在Android的應用中實現網絡圖片異步加載的方法

2019-11-26 15:02:04
字體:
來源:轉載
供稿:網友

前言
其實很幸運,入職一周之后就能跟著兩個師兄做android開發,師兄都是大神,身為小白的我只能多多學習,多多努力。最近一段時間都忙的沒機會總結,今天剛完成了android客戶端圖片異步加載的類,這里記錄一下(ps:其實我這里都是參考網上開源實現)


原理
在ListView或者GridView中加載圖片的原理基本都是一樣的:

    先從內存緩存中獲取,取到則返回,取不到進行下一步
    從文件緩存中獲取,取到則返回并更新到內存緩存,取不到則進行進行下一步
    從網絡上下載圖片,并更新內存緩存和文件緩存


流程圖如下:

2015731154609726.png (636×512)

同時,要注意線程的數量。一般在listview中加載圖片,大家都是開啟新的線程去加載,但是當快速滑動時,很容易造成OOM,因此需要控制線程數量。我們可以通過線程池控制線程的數量,具體線程池的大小還需要根據處理器的情況和業務情況自行判斷

建立線程池的方法如下:

   

ExecutorService executorService = Executors.newFixedThreadPool(5); // 5是可變的 

文件緩存類

   

 import java.io.File;      import android.content.Context;      public class FileCache {     private static final String DIR_NAME = "your_dir";     private File cacheDir;        public FileCache(Context context) {       // Find the directory to save cached images       if (android.os.Environment.getExternalStorageState().equals(           android.os.Environment.MEDIA_MOUNTED)) {         cacheDir = new File(             android.os.Environment.getExternalStorageDirectory(),             DIR_NAME);       } else {         cacheDir = context.getCacheDir();       }          if (!cacheDir.exists()) {         cacheDir.mkdirs();       }     }        public File getFile(String url) {       // Identify images by url's hash code       String filename = String.valueOf(url.hashCode());          File f = new File(cacheDir, filename);          return f;     }        public void clear() {       File[] files = cacheDir.listFiles();       if (files == null) {         return;       } else {         for (File f : files) {           f.delete();         }       }     }   } 

內存緩存類
這里使用了軟引用,Map<String, SoftReference<Bitmap>> cache,可以google一下軟引用的機制,簡單的說:實現了map,同時當內存緊張時可以被回收,不會造成內存泄露

   

 import java.lang.ref.SoftReference;   import java.util.Collections;   import java.util.LinkedHashMap;   import java.util.Map;      import android.graphics.Bitmap;      public class MemoryCache {     private Map<String, SoftReference<Bitmap>> cache = Collections         .synchronizedMap(new LinkedHashMap<String, SoftReference<Bitmap>>(             10, 1.5f, true));        public Bitmap get(String id) {       if (!cache.containsKey(id)) {         return null;       }          SoftReference<Bitmap> ref = cache.get(id);          return ref.get();     }        public void put(String id, Bitmap bitmap) {       cache.put(id, new SoftReference<Bitmap>(bitmap));     }        public void clear() {       cache.clear();     }   } 

圖片加載類

  import java.io.File;   import java.io.FileInputStream;   import java.io.FileNotFoundException;   import java.io.FileOutputStream;   import java.io.InputStream;   import java.io.OutputStream;   import java.net.HttpURLConnection;   import java.net.URL;   import java.util.Collections;   import java.util.Map;   import java.util.WeakHashMap;   import java.util.concurrent.ExecutorService;   import java.util.concurrent.Executors;      import android.content.Context;   import android.graphics.Bitmap;   import android.graphics.BitmapFactory;   import android.os.Handler;   import android.widget.ImageView;      public class ImageLoader {     /**      * Network time out      */     private static final int TIME_OUT = 30000;     /**      * Default picture resource      */     private static final int DEFAULT_BG = R.drawable.plate_list_head_bg;        /**      * Thread pool number      */     private static final int THREAD_NUM = 5;        /**      * Memory image cache      */     MemoryCache memoryCache = new MemoryCache();        /**      * File image cache      */     FileCache fileCache;        /**      * Judge image view if it is reuse      */     private Map<ImageView, String> imageViews = Collections         .synchronizedMap(new WeakHashMap<ImageView, String>());        /**      * Thread pool      */     ExecutorService executorService;        /**      * Handler to display images in UI thread      */     Handler handler = new Handler();        public ImageLoader(Context context) {       fileCache = new FileCache(context);       executorService = Executors.newFixedThreadPool(THREAD_NUM);     }        public void disPlayImage(String url, ImageView imageView) {       imageViews.put(imageView, url);       Bitmap bitmap = memoryCache.get(url);       if (bitmap != null) {         // Display image from Memory cache         imageView.setImageBitmap(bitmap);       } else {         // Display image from File cache or Network         queuePhoto(url, imageView);       }     }        private void queuePhoto(String url, ImageView imageView) {       PhotoToLoad photoToLoad = new PhotoToLoad(url, imageView);       executorService.submit(new PhotosLoader(photoToLoad));     }        private Bitmap getBitmap(String url) {       File f = fileCache.getFile(url);          // From File cache       Bitmap bmp = decodeFile(f);       if (bmp != null) {         return bmp;       }          // From Network       try {         Bitmap bitmap = null;         URL imageUrl = new URL(url);         HttpURLConnection conn = (HttpURLConnection) imageUrl             .openConnection();         conn.setConnectTimeout(TIME_OUT);         conn.setReadTimeout(TIME_OUT);         conn.setInstanceFollowRedirects(true);         InputStream is = conn.getInputStream();         OutputStream os = new FileOutputStream(f);         copyStream(is, os);         os.close();         conn.disconnect();         bitmap = decodeFile(f);         return bitmap;       } catch (Throwable ex) {         if (ex instanceof OutOfMemoryError) {           clearCache();         }         return null;       }        }        private void copyStream(InputStream is, OutputStream os) {       int buffer_size = 1024;          try {         byte[] bytes = new byte[buffer_size];         while (true) {           int count = is.read(bytes, 0, buffer_size);           if (count == -1) {             break;           }           os.write(bytes, 0, count);         }          } catch (Exception e) {          }     }        private Bitmap decodeFile(File f) {       try {         // TODO:Compress image size         FileInputStream fileInputStream = new FileInputStream(f);         Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream);         return bitmap;          } catch (FileNotFoundException e) {         return null;       }     }        private void clearCache() {       memoryCache.clear();       fileCache.clear();     }        /**      * Task for the queue      *      * @author zhengyi.wzy      *      */     private class PhotoToLoad {       public String url;       public ImageView imageView;          public PhotoToLoad(String url, ImageView imageView) {         this.url = url;         this.imageView = imageView;       }     }        /**      * Asynchronous to load picture      *      * @author zhengyi.wzy      *      */     class PhotosLoader implements Runnable {       PhotoToLoad photoToLoad;          public PhotosLoader(PhotoToLoad photoToLoad) {         this.photoToLoad = photoToLoad;       }          private boolean imageViewReused(PhotoToLoad photoToLoad) {         String tag = imageViews.get(photoToLoad.imageView);         if (tag == null || !tag.equals(photoToLoad.url)) {           return true;         }            return false;       }          @Override       public void run() {         // Abort current thread if Image View reused         if (imageViewReused(photoToLoad)) {           return;         }            Bitmap bitmap = getBitmap(photoToLoad.url);            // Update Memory         memoryCache.put(photoToLoad.url, bitmap);            if (imageViewReused(photoToLoad)) {           return;         }            // Don't change UI in children thread         BitmapDisplayer bd = new BitmapDisplayer(bitmap, photoToLoad);         handler.post(bd);       }          class BitmapDisplayer implements Runnable {         Bitmap bitmap;         PhotoToLoad photoToLoad;            public BitmapDisplayer(Bitmap bitmap, PhotoToLoad photoToLoad) {           this.bitmap = bitmap;           this.photoToLoad = photoToLoad;         }            @Override         public void run() {           if (imageViewReused(photoToLoad)) {             return;           }              if (bitmap != null) {             photoToLoad.imageView.setImageBitmap(bitmap);           } else {             photoToLoad.imageView.setImageResource(DEFAULT_BG);           }         }          }     }   } 

調用方法

  ImageLoader imageLoader = new ImageLoader(context);   imageLoader.disPlayImage(imageUrl, imageView); 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品一区二区三区在线播放视频| www.国产精品一二区| 精品一区电影国产| 国产丝袜一区二区三区免费视频| 亚洲一品av免费观看| 精品夜色国产国偷在线| 欧美专区在线观看| 91色琪琪电影亚洲精品久久| 欧美日韩另类视频| 成人a在线观看| 精品福利一区二区| 成人免费在线网址| 亚洲女同精品视频| 国产日本欧美一区二区三区| 亚洲无亚洲人成网站77777| 清纯唯美亚洲激情| 欧美日韩另类视频| 欧美国产日本在线| 久久久亚洲影院你懂的| 国产91精品高潮白浆喷水| 亚洲最大成人在线| 亚洲丝袜在线视频| 精品国产美女在线| 欧美成人免费播放| 91久久精品国产91久久| 日本19禁啪啪免费观看www| 亚洲女人天堂av| 亚洲第一区第一页| 欧美激情视频免费观看| 日韩精品电影网| 亚洲精品自在久久| 色噜噜狠狠狠综合曰曰曰88av| 97国产精品视频| 国产精品羞羞答答| 国模gogo一区二区大胆私拍| 久久亚洲精品中文字幕冲田杏梨| 日韩av大片免费看| 欧美精品videosex牲欧美| 97免费在线视频| 成人av色在线观看| 国产一区二区三区三区在线观看| 日韩av中文在线| 色偷偷88888欧美精品久久久| 国产精品久久视频| 日韩av网站大全| 欧美做受高潮1| 午夜精品www| 日韩国产精品视频| 韩国一区二区电影| 亚洲aa在线观看| 久久精品国产v日韩v亚洲| 自拍偷拍亚洲精品| 久久偷看各类女兵18女厕嘘嘘| 不卡av电影在线观看| 日韩视频―中文字幕| xvideos成人免费中文版| 国产成人精品免费久久久久| 久久久久久这里只有精品| 久久久久久久久久av| 久久成人综合视频| 久久久电影免费观看完整版| 久久久91精品国产| 精品国产老师黑色丝袜高跟鞋| 亚洲美女黄色片| 欧美精品免费在线观看| 欧美麻豆久久久久久中文| 亚洲国产精品999| 视频直播国产精品| 欧美精品午夜视频| 国产偷国产偷亚洲清高网站| 欧美一乱一性一交一视频| 热99精品里视频精品| 亚洲情综合五月天| 欧美电影免费观看网站| 国产有码在线一区二区视频| 91久久久久久国产精品| 欧美高清视频免费观看| 中日韩美女免费视频网站在线观看| 亚洲成人久久久| 亚洲春色另类小说| 久久久久久欧美| 97在线精品国自产拍中文| 国产成人亚洲综合青青| 北条麻妃99精品青青久久| 精品欧美国产一区二区三区| 精品日韩视频在线观看| 国产人妖伪娘一区91| 亚洲午夜小视频| 国产日本欧美一区二区三区在线| 欧美亚洲国产视频小说| 欧美日韩一区二区在线播放| 久久青草精品视频免费观看| 亚洲国产精品资源| 久久成人精品一区二区三区| 国产在线播放91| 欧美视频中文在线看| 97在线视频免费看| 国产一区二区三区日韩欧美| 日韩av观看网址| 国产精品www网站| 精品久久久国产精品999| 亚洲美女中文字幕| 欧美精品在线极品| 国产97在线播放| 欧美日韩国产丝袜美女| 日韩在线观看精品| 国产精品视频一区二区三区四| 精品国产鲁一鲁一区二区张丽| 亚洲成av人片在线观看香蕉| 久久久999国产| 国产欧美va欧美va香蕉在线| 亚洲一区二区国产| 欧美性xxxx极品高清hd直播| 国产精品久久不能| 日韩人体视频一二区| 欧美贵妇videos办公室| 国产精品久久久久不卡| 欧美激情按摩在线| 久久精品国产亚洲精品| 57pao成人国产永久免费| 色悠久久久久综合先锋影音下载| 国产精品视频久久久| 亚洲美女自拍视频| 4444欧美成人kkkk| 欧美视频国产精品| 亚洲成人在线视频播放| 亚洲午夜av电影| 亚洲精品97久久| 亚洲天堂av在线免费观看| 欧美激情2020午夜免费观看| 亚洲乱码一区av黑人高潮| 黄色成人在线播放| 成人免费观看49www在线观看| 久久精品电影网站| 亚洲精品第一国产综合精品| 中文字幕精品久久| 亚洲三级黄色在线观看| 欧美成人精品一区二区三区| 成人免费大片黄在线播放| 在线国产精品播放| 日韩在线视频免费观看| 欧美资源在线观看| 欧美精品激情在线观看| 亚洲一区二区国产| 美女啪啪无遮挡免费久久网站| 亚洲人午夜精品| 91在线直播亚洲| 国产精品视频公开费视频| 欧美成人在线影院| 国产女人18毛片水18精品| 欧美有码在线观看| 7777精品久久久久久| 91久久久国产精品| 国产精品久久久久久久午夜| 亚洲欧美中文字幕| 中文欧美在线视频| 欧美激情影音先锋| 黄色成人在线播放| 欧美一级电影久久| 久久亚洲综合国产精品99麻豆精品福利| 韩国精品久久久999| 日韩中文字幕不卡视频| 亚洲国产欧美一区二区丝袜黑人| 亚洲天堂成人在线视频|