图片三级缓存的流程
三级缓存的内容:
    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进行网络操作

posted on 2017-01-11 19:29  从前有個人  阅读(2127)  评论(0编辑  收藏  举报