加载网络图片的优化
1.在你滑动listView的时候如果前面的图片没加载完成,这是你滑动到后边,前面的convertView会复用给后边,后边的convertView会先加载前面的图片在加载自己的图片。
为了图片不跳动,做以下优化
2.图片bitmap 大小 = 长*宽*4
非常耗费内存资源,所以有Lru算法,将访问时间离当前最远的会被释放掉
在AsyncTask里
protected void onPreExecute() {
super.onPreExecute();
//设置Tag
ImageLoader loader = (ImageLoader) image.getTag();
if (loader != null) {
loader.cancel(false);//cancel不打断,执行doInBackground
}
image.setTag(this);
image.setImageResource(R.mipmap.coming);
}
@Override
protected void onPostExecute(Bitmap bitmap) {//如果tag不为空不执行此方法
super.onPostExecute(bitmap);
if (bitmap != null) {
image.setImageBitmap(bitmap);
ImageUtil.cache.put(url, bitmap);//放入到cache中
} else {
image.setImageResource(R.mipmap.ic_launcher);
}
image.setTag(null);//在此处如果tag为空,图片加载上之后 设置tag为空
}
@Override
protected void onCancelled(Bitmap bitmap) {
//如果tag不为空执行到此方法,
if (bitmap != null) {//如果bitmap不为空 放入cache
ImageUtil.cache.put(url, bitmap);
}
}
Lru
package com.jash.networklibrary;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.widget.ImageView;
/**
* Created by hasee on 2016/9/2.
*/
public class ImageUtil {
/*
*存进去去的时候可能会被释放掉取不到
*/
static LruCache<String, Bitmap> cache = new LruCache<String,Bitmap>(10 << 20) {
@Override
protected int sizeOf(String key, Bitmap value) {//图片的大小所占内存设定为10M
// int byteCount = value.getByteCount(); API12
int bytes = value.getRowBytes() * value.getHeight();
return bytes;
}
};
public static void loadImage(ImageView image,String url) {
Bitmap bitmap = cache.get(url);
if (bitmap != null) {
image.setImageBitmap(bitmap);
} else {
new ImageLoader(image).execute(url);
}
}
}
在适配器中加载
new ImageUtil().loadImage(holder.imageView, entry.getImgURL()); //通过图片地址获取到图片,显示到ImageView上