首先我通常使用的适配器是BaseAdapter,其中有两个方法最主要,分别是: getCount,getView,
在对Listview 进行优化的时候,首先使用 convertview 和viewHolder 配合进行优化,使用convertview的母的是
控件复用,从而加到减小内存的使用,使用viewHolder 的是减小findbyid 的次数.
可是在进行控件之后,在进行图片加载的时候,会出现图片错位的问题,这是由于控件里面有上次残留的图片在里面,因此咱们在初始化的时候须要设置一张默认图,清楚上次残留的图片,从而避免图片错位.
注意: 在进行图片加载的时候通常会形成 OOM(内存溢出),这个时候咱们须要用到三级缓存策略,来进行处理,
首先三级缓存分别是:
1:强引用(Lrucache)
2:软引用(
SoftRenfence)
3:SD卡(如今被 DisKLrucache)
首先当咱们须要加载图片的时候:
首先从强引用里面找,若是强引用没有,就从软引用里面找,若是软引用没有就从SD卡里面找,若是SD卡没有就从网络加载,经过加载请求到的图片存入到强引用(Lrucache)里面.
第二:强引用通常取内存的四分之一,当强引用满了之后,就经过Lrucache 算法讲部分图片删除,同时存入到软引用里面,当软引用满了,就将部分图片存入到SD卡里面,当SD卡满了,就将一半的删除,(删除的时候根据使用日期排序),
注意:强引用是不能被垃圾回收机制回收的,软引用是能够随时被垃圾回收机制回收的.
:一半状况下咱们加载的图片的 url,是服务器通过二次采样之后的url,只有当点击看大图的时候才加载原图.
:不管在强引用,软引用仍是SD卡咱们存图片的时候都是以键值对的形式存的,他的键就是url,通常状况下使用MD5对URL进行加密,这样作的目的是为了不URL 里面有非法字符.
二次采样:
注意:二次采样分两部进行,首先第一步咱们须要获取图片的宽和高,同时获取到须要采样后的宽和高,经过宽和高计算出咱们须要的采样比,第二步:经过采样比让咱们的图片真正实现采样缩放.
案例以下:
第一步:
假如说我有一张图片是200*200,那么我想把这张图片的缩略图显示在一个50*50的ImageView上,那个人压缩比例应该为4,(这就是咱们第一步的操做了,我先加载图片的边界到内存中,这个加载操做并不会耗费多少内存)
第二步:
在第一次采样的基础上,我来进行二次采样。二次采样的时候,我把第一次采样后算出来的结果做为一个参数传递给第BitmapFactory,这样在加载图片的时候系统就不会将整张图片加载进来了,而是只会加载该图片的一张缩略图进来,这样不只提升了加载速率,并且也极大的节省了内存,并且对于用户来讲,他也不会有视觉上的差别
具体代码如何实现:
第一次采样:首先获取new BitmapFactory.Options()获取option对象, inJustDecodeBounds
设置为true只会加载图片的边框进来,并不会加载图片具体的像素点,经过BitmapFactory.decodeFile(filePath, options);来进行第一次加载图片,经过outWidth原图的宽度,经过outHeight获取原图的高,接下来经过控件的宽度和控件的高度来获取一个采样率sampleSize,接下来进行第二次采样设置inJustDecodeBounds为false,同时设置缩放比,设置inPreferredConfig的图片的图片格式有(分别为ALPHA_8,RGB_565,ARGB_4444,ARGB_8888),最后进行图片的加载.
具体实现代码:
BitmapFactory.Options options = new BitmapFactory.Options();
// 第一次:设为true时,仅仅获得边界,即宽高
options.inJustDecodeBounds=true;
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(),options);
// 第二次:将options的值设为Config.RGB_565,会比默认的Config.ARGB_8888减小一半内存;
options.inPreferredConfig= Bitmap.Config.RGB_565;
// 将边框缩减到原来宽高的1/100;
options.inSampleSize=Math.max(options.outWidth,options.outHeight)/100;
// 设置为false,表示不单单加载边框,
options.inJustDecodeBounds=false;
bitmap=BitmapFactory.decodeFile(file.getAbsolutePath(),options)算法