Bitmap
1.bitmap是Android中的图像处理最重要的类之一
2.通过bitmap能获取图片的信息
3.获取到信息后,可对其进行缩放,裁剪等操作
Bitmap为我们提供了对图像文件的操作支持,就像file类提供对文件的操作支持一样。
bitmap的加载方式
为什么要高效率的加载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