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);
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android 实现图片缓存异步加载框架学习笔记

最近想把Android异步加载实现原理的理解整理下,学习了郭林大神的关于内存缓存和硬盘缓存的系列博客,自己也想写写自己看完博客后的收获。先推荐郭大神的这篇博客Android照片墙完整版,完美结合Lru...

Android-缓存网络图片(MVP模式)学习笔记

Android之缓存网络图片到内存中学习笔记访问网络图片是很普遍的事了,在前面的学习中,我也写过了几次异步网上请求网络图片,但是没有缓存图片,那么我们也都知道,有时候访问一些经常访问的网络图片,如果不...

Android-Universal-Image-Loader 学习笔记(四)图片缓存策略

图片缓存策略详解       一、简介           我们一般去加载大量的图片的时候,都会做缓存策略,缓存又分为内存缓存和硬盘缓存.作为一个强大的图片加载框架,Universal-Image-L...

Android异步加载学习笔记之四:利用缓存优化网络加载图片及ListView加载优化

如果不做任何处理,直接用网络加载图片在网速快的情况下可能没什么不好的感觉,但是如果使用移动流量或是网络不好的时候,问题就来了,要么用户会抱怨流量使用太多,要么抱怨图片加载太慢,如论从哪个角度出发,都不...
  • true100
  • true100
  • 2015年08月11日 21:02
  • 785

Android知识总结:Universal-Imageloader学习笔记5 一种特殊情况下的图片缓存方式

背景 在最近的项目中,由于后台的特殊要求,每次加载图片时,图片url都会携带一个时间戳,即如下图片格式为这样的形式:http://xxxx/aaaa/cccc.jpg?timestamp 其中问号前面...
  • lidec
  • lidec
  • 2016年01月06日 23:36
  • 724

Android网络图片加载缓存处理库的使用---第三方库学习笔记(五)

两款比较优秀的开源图片处理库框架:Universal-ImageLoader和Picasso。Universal-ImageLoader简介: Universal-ImageLoader是目前And...

Android开发笔记(七十七)图片缓存算法

ImageCache 由于手机流量有限,又要加快app的运行效率,因此好的app都有做图片缓存。图片缓存说起来简单,做起来就用到很多知识点,可算是集Android技术之大全了。只要理解图片缓存的算法,...
  • aqi00
  • aqi00
  • 2016年03月09日 14:46
  • 1927

Android开发笔记图片缓存 手势及OOM分析

原文转自:http://www.it165.net/pro/html/201601/59439.html#  把图片缓存、手势及OOM三个主题放在一起,是因为在Android应用开发过程中,这三...
  • true100
  • true100
  • 2016年01月13日 16:27
  • 920

安卓笔记android 图片缓存 LurCache 值得注意的几点

@by moses   图片缓存 LurCache 值得注意的几点 使用到的对象:  一、定义一个帮助类A 包含{构造方法、一个LruCache对象cache一个内部...

某宅的Android学习笔记(二)——图片三级缓存

自学三个月的Android,磕磕碰碰写了一个小项目“看知乎”,数据源来自大神的看知乎API。这里记录一下自己在coding中收获的一些知识点。...
  • mouzhai
  • mouzhai
  • 2016年08月22日 16:24
  • 430
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-图片的缓存实现笔记
举报原因:
原因补充:

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