Android-图片的缓存实现笔记

原创 2015年11月19日 18:43:14

图片的缓存笔记记录

  • 这是处理加载的asset文件的图片
  • 主要代码
public class ImageBuffer 
{
    Context context;
    LruCache<String, Bitmap> lruCache;
    private static ImageBuffer imageBuffer;
    //得到运行的最大内存
    int maxMemory = (int) Runtime.getRuntime().maxMemory();
    private ImageBuffer(Context context) {
        this.context = context;
        lruCache = new LruCache<String, Bitmap>(maxMemory / 8)
        {
            //测量bitmap的大小
            @Override
            protected int sizeOf(String key, Bitmap value)
            {
                return value.getRowBytes()*value.getHeight();
            }
        };
    }
    //单例模式
    public static ImageBuffer getImageBuffer(Context context)
    {
        if(imageBuffer == null)
        {
            imageBuffer = new ImageBuffer(context);
        }
        return imageBuffer;
    }
    /**
     * 获取bitmap
     * @param path 在asset中的路径
     * @return
     */
    public Bitmap getBitmap(String path, onImageLoader lis)
    {
        //首先从缓存中找图片
        Bitmap bitmap = lruCache.get(path);
        if (bitmap != null)return bitmap;
        //如果缓存中没有就到asset中获取
        getBitmapInAssets(path, lis);
        return null;
    }
    //从asset文件夹中获取图片
    private void getBitmapInAssets(final String path, final onImageLoader lis)
    {
        new Thread()
        {
            @Override
            public void run() {
                AssetManager assetManager = context.getAssets();
                try {
                    //打开的图片是一个输入流
                    InputStream in = assetManager.open(path);
                    //将输入流域转换成一个字节数组
                    byte[] bytes = getBitmapBytes(in);
                    if (bytes != null)
                    {
                        //对图片压缩处理
                        Bitmap bm = scaleBitmap(bytes);
                        //添加到缓存
                        addBitmapToCache(path, bm);
                        lis.onImageLoadeSusscess(bm);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
    /**
     * 将bitmap的添加至缓存
     */
    public void addBitmapToCache(String key, Bitmap value) {
        if (key != null && value != null) {
            lruCache.put(key, value);
        }
    }
    /**
     * 回调接口
     */
    public interface onImageLoader{
        void onImageLoadeSusscess(Bitmap bitmap);
    }
    /**
     * 获取图片流的字节数组
     * @param in
     * @return
     * @throws IOException 
     */
    public byte[] getBitmapBytes(InputStream in) throws IOException
    {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = in.read(buffer)) != -1)
        {
            out.write(buffer, 0, len);
        }
        return out.toByteArray();
    }
    /**
     * 对图片进行压缩处理
     * @param dataByte 图片的字节数据
     * @return
     */
    public Bitmap scaleBitmap(byte[] dataByte)
    {
        Options options = new Options();
        //每个像素占2个字节,比ARGB_8888降低一半 没有透明度
        options.inPreferredConfig = Config.RGB_565;
        //让系统能及时回收内存     当内存不足的时候就回收掉
        options.inInputShareable = true;
        options.inPurgeable = true;
        if(dataByte.length>2048){
            //对大图片进行压缩,编程原图的1/2
            options.inSampleSize = 2;
        }
        return BitmapFactory.decodeByteArray(dataByte, 0, dataByte.length, options);
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

图片缓存实现

在网络编程当中,如果我们能将向网络请求的图片缓存在本地当中,这将大大的提高我们重复加载图片的速度,使得用户体验更加的好。图片缓存的原理是以网络链接为原型,然后进行格式化的转换,形成一个新的名称,以这个...
  • qq_25276029
  • qq_25276029
  • 2015年05月03日 09:26
  • 456

java springMVC 图片缓存问题

现在做的项目,需要将图片一次性加载到页面上,我试过从数据库里面读二进制,发现花的时间太长,基本上要十几秒才能加载出来,而且图片越多加载越慢,就想着怎么能将图片下载到本地,再去读本地的地址,这样肯定就会...
  • baidu_22244991
  • baidu_22244991
  • 2016年11月23日 16:32
  • 1031

简单实现Android图片三级缓存机制

用户在使用我们的APP时,通常会重复浏览一些图片,这时如果每一次浏览都需要通过网络获取图片,那么将会非常流量。为了节省用户流量,提高图片加载效率,我们通常使用图片三级缓存策略,即通过网络、本地、内存三...
  • mynameishuangshuai
  • mynameishuangshuai
  • 2016年10月12日 16:35
  • 7160

fresco(最牛逼的图片缓存加载框架),包括xutil的使用

步骤:http://www.fresco-cn.org/docs/index.html 1.加入dependence依赖: compile 'com.facebook.fresco:fresc...
  • Zuo_XP
  • Zuo_XP
  • 2016年10月13日 17:55
  • 650

Android 图片缓存之内存缓存技术LruCache

转自:http://blog.chinaunix.net/uid-26930580-id-4138306.html 在Android中,有一个叫做LruCache类专门用来做图片缓存处理的。 它有...
  • qq_26222859
  • qq_26222859
  • 2016年02月27日 19:14
  • 441

浏览器如何实现图片缓存

https://www.mnot.net/cache_docs/ WordPress博客里大量的图片会使页面加载速度变得缓慢。 此时访问者需要用更多时间才能打开一个页面。 不过我们可以通...
  • melody_day
  • melody_day
  • 2016年12月09日 10:15
  • 2876

有道云笔记 Markdown 中如何引用自己的图片

Markdown 可以引用网上的图片,但是自己的图片,要想在Markdown中引用,则需要想办法把自己的图片上传到网上,常用的方法无非2两种:github、博客。我发现有另外的第3种方法,它更简单,而...
  • Veechange
  • Veechange
  • 2017年08月18日 11:33
  • 1424

Glide图片框架使用详细介绍(二)之缓存策略

一、 上篇文章我们了解到 Glide的基本使用很简单,且可配置度高 http://blog.csdn.net/qq_37237245/article/details/72956121 Gl...
  • qq_37237245
  • qq_37237245
  • 2017年06月09日 12:26
  • 390

图说浏览器的缓存原理及缓存方式说明(1)

首先,我们从表面上研究开始。 一、从浏览器打开一个页面,是怎么一个过程? 1.用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回...
  • alex8046
  • alex8046
  • 2015年03月28日 15:57
  • 1554

不从缓存中读取图片(转)

IE的缓存提高了网络传输的效率,但是有时候也给我们带来了麻烦,比如在某个模块的修改页面上,我们把其中的图片替换掉,但是图片的名字和原来的图片名字一样(比如为了方便管理和统一图片命名,每个物品对应的图片...
  • ChoTech
  • ChoTech
  • 2007年08月28日 16:39
  • 670
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-图片的缓存实现笔记
举报原因:
原因补充:

(最多只允许输入30个字)