我有一个覆盖Application对象的对象。在其中,我有一个成员变量aLongSparseArray,其中键是long类型的某个标识符,值是一个有两个成员变量的对象:aBitmap和along用作时间戳。这是我的全局图像缓存。有时,会运行一个函数来查看时间戳并对超过一小时的内容进行老化。“age”的意思是它从LongSparseArray中删除整个条目。我的问题是:假设我有一个Activity和一个ListView。ListView中的每一行都有一个用缓存中的图像填充的ImageView。Bitmap image = ((MyApp)getApplicationContext()).getImage(id);holder.imgImage.setImageBitmap(image);现在,假设用户单击某个按钮,将其带到一个新的Activity。在这个新的Activity页上,以前分配给ListView页中的行的图像。因此,概括地说,Activity键/值项现在不再存在于全局Bitmap中。那LongSparseArray真的能被Java回收吗?它是否仍被前一个Bitmap的ImageView中的ListView引用?当然,假设android没有回收Activity所使用的内存。我问这个问题的原因是我以前的老化函数也会在Activity上调用.Recycle()。在这种情况下,当用户点击back按钮并返回到使用该Bitmap的前一个Activity时,应用程序将崩溃,这可能是因为该Bitmap不仅从缓存中丢失,而且从内存中丢失。所以我刚刚删除了Bitmap呼叫。顺便说一下,一旦.Recycle()从缓存中移除,并且屏幕上再次显示具有该id的对象,应用程序将再次下载Bitmap并将其放置在缓存中。如果前一个留在了记忆中,你可以看到这将如何提出一个问题。还有,有没有人对更有效的解决方案有什么想法?如果设置Bitmap,会发生什么情况?有2个myImageView.setDrawingCacheEnabled(false);使用此图像缓存。一个是搜索屏幕,在用户执行搜索后显示项目列表(及其图像)。另一个是用户选择保留的项目列表。 最佳答案 问题:一旦对位图调用recycle()方法,就不应再使用该位图。如果试图绘制位图,则将引发异常。从 >:只有在确定位图不是使用时间更长。如果调用recycle()并稍后尝试绘制位图,您将得到错误:“画布:尝试使用回收位图“。在这种特定情况下,您已经回收了位图,但是ListView项的ImageView对位图有很强的引用。返回活动时,ListView项尝试绘制位图,因此引发异常。位图内存管理:在Android 2.3.3之前,位图的背景像素数据存储在本机内存中,位图本身存储在dalvik内存中。因此,要释放本机内存,必须调用recycle方法。下面是Bitmap.recycle函数定义: public void recycle() { if (!mRecycled) { if (nativeRecycle(mNativeBitmap)) { // return value indicates whether native pixel object was actually recycled. // false indicates that it is still in use at the native level and these // objects should not be collected now. They will be collected later when the // Bitmap itself is collected. mBuffer = null; mNinePatchChunk = null; } mRecycled = true; } }在Android 3.0之后,背景像素数据也存储在dalvik存储器中。当不再需要位图时,我们需要确保不保留对该位图的任何强引用,以便对其进行垃圾收集。解决方案:如果仍支持Android 2.3.3和更低版本,则仍需要使用recycle来释放位图。可以使用引用计数来跟踪ListView项当前是否正在引用位图,这样即使位图已过期,也不会对其调用recycle。listview adapater的getView方法是将位图分配给imageview的位置。在这里,您将增加引用计数。您可以将docs附加到ListView以了解ListView项何时放入回收站。这是您要减少位图的引用计数的位置。只有当引用计数为零时,aging函数才需要回收位图。您还可以考虑使用setRecyclerListener进行缓存,如LruCache中所述。setDrawingCacheenabled:通过使用true param调用此方法,对getDrawingCache的下一次调用将把视图绘制为位图。视图的位图版本可以呈现在屏幕上。由于它只是一个位图,我们不能像处理实际视图那样与它交互。两个用例是:当滚动ListView时,将捕获并呈现显示项视图的位图。这样滚动的视图就不会经过测量和布局过程。在DDMS中查看层次结构功能。
09-25 20:21