图片三级缓存的流程 三级缓存的内容: 1. 从内存中获取图片,有,加载显示 2. 如果内存中没有,从本地获取图片,有加载显示,并且将图片缓存到内存,为下一次显示准备 3. 如果本地也没有,从网络下载图片,下载完成,显示图片,通过缓存到内存,保存到本地文件中,为下一次显示准备 在内存中获取图片有两种方式 第一种:软引用的方式(不太常用了) 强引用: user = new UserInfo(), 不会轻易被系统回收 软引用: SoftReference<Bitmap>, 当内存不足的时候,系统会回收软引用 弱引用: WeakReference<Bitmap>, 当内存不足的时候,系统会回收弱引用,如果软引用和弱引用同时存在,先回收弱引用 虚引用: PhantomReference<Bitmap>, 当内存不足的时候,系统会回收弱引用,优先级低于弱引用 第二种:LruCache方式 判断最新一段时间内的图片引用的次数,判断是否需要缓存,将使用频率比较高的音乐缓存到内存中去 1、创建LruCache对象 public MyCacheBitmapUtils(){ //map = new HashMap<String, SoftReference<Bitmap>>(); //maxSize : 缓存空间大小,一般是总内存的 8 分之一 int maxSize = (int) (Runtime.getRuntime().totalMemory()/8); lruCache = new LruCache<String, Bitmap>(maxSize){ // 获取缓存图片的 大小 @Override protected int sizeOf(String key, Bitmap value) { //value.getRowBytes() : 获取图片一行占用的字节数 return value.getRowBytes() * value.getHeight(); } }; } 2、缓存图片 public void saveBitmap(String url,Bitmap bitmap){ //SoftReference<Bitmap> softReference = new SoftReference<Bitmap>(bitmap);// 使用软引用修改 bitmap 引用 //map.put(url, softReference); lruCache.put(url, bitmap); } 3、获取缓存图片 public Bitmap getBitmap(String url){ /*SoftReference<Bitmap> softReference = map.get(url); // 确认软引用没有被回收 if (softReference != null) { Bitmap bitmap = softReference.get(); return bitmap; }*/ Bitmap bitmap = lruCache.get(url); return bitmap; } 4、将上面三步放到一个工具类中 通过工具类调用 本地缓存 通过IO流操作 保存和读取文件 1、保存图片 File file = new File(dr, MD5Util.Md5(url).substring(0, 10)); FileOutputStream stream = new FileOutputStream(file); // 设置图片类型质量,将图片保存本地文件中 // 参数 1 :图片格式 // 参数 2 :图片的质量 // 参数 3 :写入流 bitmap.compress(CompressFormat.JPEG, 100, stream); 2、获取图片 File file = new File(PATH, MD5Util.Md5(url).substring(0, 10)); Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); return bitmap; 网络获取 URL mUrl = new URL(url); HttpURLConnection con = (HttpURLConnection) mUrl.openConnection(); con.setConnectTimeout(5000);// 设置链接超时时间 con.setReadTimeout(5000);// 设置读取超时时间 con.connect();// 链接网络操作 int code = con.getResponseCode();// 获取服务器响应码 if (code == 200) { // 获取服务器数据,以流的形式返回 InputStream stream = con.getInputStream(); Bitmap bitmap = BitmapFactory.decodeStream(stream); return bitmap; } 此处采用HttpURLConnection进行网络操作
转载于:https://www.cnblogs.com/yegong0214/p/6274907.html