图片三级缓存的流程

it2022-05-05  45

 图片三级缓存的流程 三级缓存的内容:     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


最新回复(0)