Bitmap的高效加载与Android缓存

时间:2023-02-01 20:49:30

Bitmap

   1.bitmap是Android中的图像处理最重要的类之一

    2.通过bitmap能获取图片的信息

    3.获取到信息后,可对其进行缩放,裁剪等操作

        Bitmap为我们提供了对图像文件的操作支持,就像file类提供对文件的操作支持一样。

    bitmap的加载方式

Bitmap的高效加载与Android缓存

    为什么要高效率的加载bitmap?

    1.防止内存溢出

    2.尽可能的节省内存的开销

    3.使APP更加流畅

    如何高效加载?

    BitmapFactory.Options这个类提供了高效加载的可能性。

    重要属性如下:

    1.inJustDecodeBounds

    2.outWidth&outHeight

    3.inSampleSize

 
public static Bitmap getMinBitmap(String filePath, int pixelW, int pixelH) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        //预加载
        BitmapFactory.decodeFile(filePath, options);
        //获取预加载之后的宽高
        int originalw = options.outWidth;
        int originalh = options.outHeight;
        options.inSampleSize = getSimpleSize(originalw, originalh, pixelW, pixelH);
        options.inJustDecodeBounds=false;
        return BitmapFactory.decodeFile(filePath, options);
    }

    //将预加载的宽高与要显示的宽高进行采样率计算
    public static int getSimpleSize(int originalw, int originalh, int pixelW, int pixelH) {
        int simpleSize=1;
        if(originalw>originalh && originalw>pixelW){
                simpleSize=originalw/pixelW;
        }else if (originalw<originalh && originalh>pixelH){
            simpleSize=originalh/pixelH;
        }
        if(simpleSize<1){
            simpleSize=1;
        }
        return  simpleSize;
    }

    Android缓存

        1.对一些经常不发生变化的数据,使用缓存,提升响应速度。

       2.不频繁的请求服务器,降低服务器的压力。

       3.特殊场景使用 离线阅读。

    常见使用场景

    1.listView图片加载与Bimmap和file等大数据。

    2.数据不需要实时更新

    常用缓存策略

    1.android LruCache内存缓存(V4包里面有)

    2.android DiskLruCache实现硬盘缓存(第三方,Goolgle支持)

    3.SQLite实现缓存


    LruCache概念

    1.Lru是计算机科学经常使用的一种近期最少使用算法

      2.内部采用的是LinkedhashMap

      3.该实现是为了取代SoftReference(软引用)

        LruCache的使用

    private static SimpleImageLoader mLoader;

    private LruCache<String, Bitmap> mLruCache;

    public static SimpleImageLoader getInstance() {
        if (mLoader == null) {
            synchronized (SimpleImageLoader.class) {
                if (mLoader == null) {
                    mLoader = new SimpleImageLoader();
                }
            }

        }
        return mLoader;
    }

    //初始化缓存对象
    private SimpleImageLoader() {
        int maxSize= (int) (Runtime.getRuntime().maxMemory()/8);
        mLruCache=new LruCache<String,Bitmap>(maxSize){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();
            }
        };

    }
    /**
     * 加载网络图片
     * @param view
     * @param url
     */
     public void disPlayImage(ImageView view, String url){
         Bitmap bitmap=getBitmapFromCache(url);
        if(bitmap!=null){
        view.setImageBitmap(bitmap);
        }else{
            downloadImage(view,url);//下载图片
        }
     }

    /**
     * 从缓冲中读取图片
     * @param url
     * @return
     */
     private Bitmap getBitmapFromCache(String url){
        return mLruCache.get(url);
     }

    /**
     * 将下载的图片保存到LruCache
     * @param bitmap
     * @param url
     */
     private void putBitmapToCache(Bitmap bitmap,String url){
         if(bitmap!=null){
             mLruCache.put(url,bitmap);
         }
     }

    DiskLruCache(第三方jar包)

    1.通过DiskLruCache.open去初始化一个缓存对象

      2.DiskLruCache.get(String key)去获取到对应的缓存数据

      3.DiskLruCache.Editor对象将数据保存到本地

    注意问题:

    1.根据外之存储设置合适的缓存路径

        有外置:/sdcard/Android/data/<application pag>/cache

        无外置:/data/data/Android/data/<application pag>/cache

    2.缓存文件时对key的要求

    大神针对DiskLruCache进行的封装地址:https://github.com/hongyangAndroid/base-diskcache/tree/master/src/main/java/com/zhy/base/cache/disk