zoukankan      html  css  js  c++  java
  • 图片三级缓存的流程

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

  • 相关阅读:
    基于Yarp实现内网http穿透
    让Github畅通无阻,FastGithub1.0.0发布
    Pipeline模式与Factory+Provider模式的应用
    开源FastGithub
    开源Influxdb2高性能客户端
    开源AwaitableCompletionSource,用于取代TaskCompletionSource
    SourceGenerator入门指北
    dotnet高性能buffer
    CURL用法
    Nginx的进程管理与重载原理
  • 原文地址:https://www.cnblogs.com/yegong0214/p/6274907.html
Copyright © 2011-2022 走看看