gpt4 book ai didi

android - 在 SoftReferences 中延迟加载 Drawable 失败

转载 作者:太空狗 更新时间:2023-10-29 16:25:08 26 4
gpt4 key购买 nike

我有一个包含 100 张不同图像的 ListView 。我的缓存如下所示,

public class ImageCache {
HashMap<String, SoftReference<Drawable>> myCache;
....
....
public void putImage(String key, Drawable d) {
myCache.put(key, new SoftReference<Drawable>(d));
}

public Drawable getImage(String key) {
Drawable d;
SoftReference<Drawable> ref = myCache.get(key);

if(ref != null) {
//Get drawable from reference
//Assign drawable to d
} else {
//Retrieve image from source and assign to d
//Put it into the HashMap once again
}
return d;
}
}

我有一个自定义适配器,我通过从缓存中检索可绘制对象来设置 ImageView 的图标。

public View getView(int position, View convertView, ViewGroup parent) {
String key = myData.get(position);
.....
ImageView iv = (ImageView) findViewById(R.id.my_image);
iv.setImageDrawable(myCache.getImage(key));
.....
}

但是当我运行该程序时,ListView 中的大部分图像会在一段时间后消失,其中一些甚至一开始就不存在。我用硬引用替换了 HashMap。喜欢,

HashMap<String, Drawable> myCache

那段代码有效。我想优化我的代码。任何建议。

最佳答案

这段代码看起来有问题:

    if(ref != null) {
//Get drawable from reference
//Assign drawable to d
} else {
//Retrieve image from source and assign to d
//Put it into the HashMap once again
}

如果软引用已经被释放,你将在第一种情况下结束,不检测它,也不重新加载图像。你需要做更多像这样的事情:

    Drawable d = ref != null ? ref.get() : null;
if (d == null) {
//Retrieve image from source and assign to d
//Put it into the HashMap once again
}
//Get drawable from reference
//Assign drawable to d

该平台广泛使用弱引用来缓存从资源和其他东西加载的可绘制对象,因此如果您从资源中获取东西,您可以让它为您处理。

关于android - 在 SoftReferences 中延迟加载 Drawable 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3818531/

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