gpt4 book ai didi

java - Lru Cache listView 图片问题

转载 作者:行者123 更新时间:2023-11-29 05:52:04 26 4
gpt4 key购买 nike

我的 ListView 包含我的 Activity 图像,在我添加 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;
}

最佳答案

我读了很多关于 ListView 问题的图像,它与 ListView 回收有关,一些相关帖子:

我添加的是 onPostExecute 方法中的 else 语句,如果标签不是标签上设置的标签,我会取消它。

固定码its

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);
} else if (mTarget.getTag() != null) {
((AsyncLoader) mTarget.getTag()).cancel(true);
mTarget.setTag(null);
}
}
}

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);
}
}
}

我认为谷歌需要解决这个问题或提供更简洁的解决方法,因为(在我看来)谷歌未能构建开发人员只需要关心构建自己的应用程序而不是浪费时间寻找方法的东西修复 sdk 问题

关于java - Lru Cache listView 图片问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13519733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com