Application
对象。在里面,我有一个成员变量,它是一个LongSparseArray
,其中键是类型为long
的某个标识符,而值是具有两个成员变量的对象:一个Bitmap
和一个用作时间戳的long
。这是我的全局图像缓存。偶尔会运行一个函数,查看时间戳并使超过一小时的条目过时。
通过“过时”,我指的是从
LongSparseArray
中删除整个条目。我的问题是:
假设我有一个带有
ListView
的Activity
。每个ListView
中的行都有一个ImageView
,它使用缓存中的图像填充。Bitmap image = ((MyApp)getApplicationContext()).getImage(id);
holder.imgImage.setImageBitmap(image);
现在,假设用户点击某个按钮,该按钮会将他们带到一个新的
Activity
。当在这个新的Activity
上时,之前分配给在上一个Activity
中ListView
中一行的图像已经过时。因此,简要概括一下,在全局
LongSparseArray
中,该Bitmap
键/值条目现在不再存在。那么,这个
Bitmap
能被Java回收吗?它还被ListView
中的ImageView
引用,前面的Activity
中使用了它吗?当然,假设Android没有回收该Activity
所使用的内存。我问这个问题的原因是,我的上一个老化函数也会在
Bitmap
上调用.Recycle()
。在这种情况下,当用户点击返回按钮并返回到先前使用该Bitmap
的Activity
时,应用程序会崩溃,可能是因为该Bitmap
不仅从缓存中消失,而且还从内存中消失。所以我只是删除了.Recycle()
调用。顺便说一下,一旦
Bitmap
从缓存中删除,并且具有该ID的对象再次显示在屏幕上,应用程序将重新下载Bitmap
并将其放入缓存中。如果以前的内存仍然存在,您可以看到这会产生问题。此外,有没有人有更有效的解决方案?
如果我设置
myImageView.setDrawingCacheEnabled(false);
会发生什么?有两个
Activities
使用此图像缓存。一个是搜索屏幕,在用户执行搜索后显示项目列表(及其图像)。另一个是所选项目列表。