我的 ListView 在我的活动中有图像,在我添加 LRU 缓存之前效果很好。当我第一次加载(如果我不滚动它)同时加载图像时,第一个元素会在我加载的所有图像之间更改其图像。
我的 LRU 缓存看起来像
public class Image {
private static LruCache<String, Bitmap> mMemoryCache = null;
private static int cacheSize = 1024 * 1024 * 10;
private static class AsyncLoader extends AsyncTask<String, Void, Bitmap> {
private ImageView mTarget;
public AsyncLoader(ImageView target) {
this.mTarget = target;
}
@Override
protected void onPreExecute() {
mTarget.setTag(this);
}
@Override
protected Bitmap doInBackground(String...urls) {
String url = urls[0];
Bitmap result = null;
if (url != null) {
result = load(url);
if (result != null) {
mMemoryCache.put(url, result);
}
}
return result;
}
@Override
protected void onPostExecute(Bitmap result) {
if (mTarget.getTag() == this) {
mTarget.setTag(null);
if (result != null) mTarget.setImageBitmap(result);
}
}
}
public static Bitmap load(String urlString) {
if (urlString == null || urlString.length() == 0) return null;
Bitmap bitmap = null;
URL url = null;
try {
url = new URL(urlString);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
public static void loadToView(String url, ImageView view) {
if (url == null || url.length() == 0) return;
if (mMemoryCache == null) {
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return (bitmap.getRowBytes() * bitmap.getHeight());
}
};
}
Bitmap bitmap = getBitmapFromMemCache(url);
if (bitmap == null) {
final AsyncLoader task = (AsyncLoader) new AsyncLoader(view);
view.setTag(task);
task.execute(url);
} else {
view.setImageBitmap(bitmap);
}
}
}
用法:
Image.loadToView("http://image_url", (ImageView) view.findViewById(R.id.img_thumbnail));
这就是我的 BaseAdapter getView 的样子
@Override
public View getView(final int position, View view, ViewGroup parent) {
if (view == null) view = inflater.inflate(R.layout.list_item, null);
((TextView) view.findViewById(R.id.txt_name)).setText(filtered_data.get(position).name);
Image.loadToView("http://graph.facebook.com/" + filtered_data.get(position).id + "/picture", (ImageView) view.findViewById(R.id.img_thumbnail));
return view;
}