美文网首页
Android图片三级缓存--简洁,明了

Android图片三级缓存--简洁,明了

作者: 落叶随风花开半夏 | 来源:发表于2019-03-11 11:24 被阅读0次

为什么要对图片进行三级缓存

图片每次从服务端加载不太好
a.浪费用户流量
b.加大服务器的压力
c.加载图片耗时,用户体验性差

  因此我们把图片缓存到本地 使用三级缓存
  最快的是内存
  其次是外部存储
  最后才是网络存储
  首先去内存中加载图片  ->   外部存储中加载图片   ->  网络
  不可能把所有图片都缓存到内存中,存储空间不允许这样做。

首先创建LRU Least recently used,最近最少使用算法

采用LruCache

    LruCache<String,Bitmap> cache;
    File cacheDir;
    //占内存的20%
    int cacheSize = (int) Runtime.getRuntime().freeMemory();
    cacheSize = (int) (cacheSize * 0.2);
    cache = new LruCache<>(cacheSize);

    cacheDir = new File(context.getCacheDir(),"YmsImages");
    //如果目录不存在,创建
    if (!cacheDir.exists()){
        cacheDir.mkdirs();
    }

加载网络图片传入图片Url

    //加载url图片
public Bitmap getImages(String imageUrl){
    Bitmap bitmap = null;

    //先从内存获取
    bitmap = cache.get(url2Key(imageUrl));
    if (bitmap != null) {
        Log.i("TEST", "从内存中加载图片:" + imageUrl);
        return bitmap;
    }
    
    //从外部存储获取
    bitmap = loadBitmapFromFile(imageUrl);
    if (bitmap != null) {
        Log.i("TEST", "从外部存储中加载图片:" + imageUrl);
        //存入内存
        cache.put(url2Key(imageUrl),bitmap);
        return bitmap;
    }

    //从网络获取

    try {
        URL url = new URL(imageUrl);
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.setConnectTimeout(5000);
        urlConnection.setReadTimeout(5000);
        int responseCode = urlConnection.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {
            //获取图片
            bitmap = BitmapFactory.decodeStream(urlConnection.getInputStream());
            //保存到文件
            saveBitmap2File(imageUrl,bitmap);
            //保存到缓存
            cache.put(url2Key(imageUrl),bitmap);
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    Log.i("TEST", "从网络中加载图片:" + imageUrl);
    return bitmap;
}
/**
 * 将图片保存到文件
 * @param imageUrl
 * @param bitmap
 */
private void saveBitmap2File(String imageUrl, Bitmap bitmap) throws FileNotFoundException {
    File iamgeFile = new File(cacheDir,url2Key(imageUrl));
    //固定目录
    bitmap.compress(Bitmap.CompressFormat.JPEG,100,
            new FileOutputStream(iamgeFile));
}

/**
 * 从文件加载图片
 * @param imageUrl
 * @return
 */
private Bitmap loadBitmapFromFile(String imageUrl) {
    File imageFile = new File(cacheDir,url2Key(imageUrl));
    if (imageFile.mkdirs()){//判断文件是否存在
        return BitmapFactory.decodeFile(imageFile.getAbsolutePath());
    }
    return null;
}

/**
 * 获取文件内存位置
 * @param imageUrl
 * @return
 */
private String url2Key(String imageUrl) {
    return String.valueOf(imageUrl.hashCode());
}

相关文章

  • Android图片三级缓存--简洁,明了

    为什么要对图片进行三级缓存 图片每次从服务端加载不太好a.浪费用户流量b.加大服务器的压力c.加载图片耗时,用户体...

  • Android 图片三级缓存 _内存缓存LruCache

    本文目标 理解Android图片三级缓存机制,并重点理解内存缓存 (LruCache算法) 图片的缓存技术分为三级...

  • android图片的三级缓存策略和LruCache(面试必看)

    原理 Android图片三级缓存的原理如下图所示: 可见,Android中图片的三级缓存主要是强引用、软银用和文件...

  • Android图片三级缓存总结

    Android图片中的三级缓存 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络...

  • 图片缓存

    参考:内存缓存LruCache实现原理Android中图片的三级缓存策略Android官方教程:保存到文件andr...

  • LruCache

    1.三级缓存 ⑴为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常...

  • Android 学习笔记之图片三级缓存

    最近在学习的时候接触到Android对图片的获取途径,写一篇笔记记录一发。 什么是图片三级缓存 三级缓存指的是内存...

  • 内存优化

    如何获取Android系统中申请对象的信息 [译]Android内存泄漏的八种可能 Android中图片的三级缓存

  • 浅谈图片加载的三级缓存

    浅谈图片加载的三级缓存 之前被人问及过,图片的三级缓存是什么啊,来给我讲讲,图片三级缓存,好高大尚的名字,听着挺厉...

  • Android图片压缩那点事

    在Android开发中,图片的处理很长用到,网上图片的三级缓存的工具有很多,但是很多时候会对图片进行处理,...

网友评论

      本文标题:Android图片三级缓存--简洁,明了

      本文链接:https://www.haomeiwen.com/subject/cdyvpqtx.html