【发布时间】:2014-08-26 15:42:27
【问题描述】:
我有一个覆盖Application 对象的对象。在其中,我有一个成员变量,它是 LongSparseArray,其中键是 long 类型的标识符,值是具有 2 个成员变量的对象:Bitmap 和 long,用作时间戳。
这是我的全局图像缓存。有时,会运行一个函数来查看超过一小时的时间戳和年龄。
“年龄”是指它将整个条目从LongSparseArray 中删除。
这是我的问题:
假设我有一个Activity 和一个ListView。 ListView 中的每一行都有一个 ImageView,其中填充了缓存中的图像。
Bitmap image = ((MyApp)getApplicationContext()).getImage(id);
holder.imgImage.setImageBitmap(image);
现在,假设用户单击某个按钮,将他们带到一个新的Activity。在这个新的Activity 上,之前分配给ListView 中一行的图像在之前的Activity 年龄。
因此,回顾一下,Bitmap 键/值条目现在不再存在于全局 LongSparseArray 中。
那个Bitmap真的可以被Java回收吗?之前Activity的ListView中的ImageView不是还在引用吗?当然,假设 Android 没有回收 Activity 使用的内存。
我问这个的原因是我以前的老化函数也会在Bitmap 上调用.Recycle()。在这种情况下,当用户点击后退按钮并返回到之前使用 Bitmap 的 Activity 时,应用程序将崩溃,可能是因为 Bitmap 不仅从缓存中丢失,而且从内存中丢失.所以我刚刚删除了.Recycle() 电话。
顺便说一句,一旦 Bitmap 从缓存中删除,并且具有该 ID 的对象再次出现在屏幕上,应用程序将再次下载 Bitmap 并将其放入缓存中。如果前一个保留在内存中,您可以看到这会带来什么问题。
另外,有人对更有效的解决方案有任何想法吗?
如果我设置myImageView.setDrawingCacheEnabled(false);会发生什么?
有 2 个Activities 使用此图像缓存。一种是在用户执行搜索后显示项目列表(及其图像)的搜索屏幕。另一个是用户选择保留的那些项目的列表。
【问题讨论】:
-
O' CommonsWare,O' CommonsWare,你在哪里 CommonsWare?
标签: android listview caching android-activity