1

我的应用程序中的几个Activitys 在 a 中显示图像,ListView其中的每一行都ListView包含一个ImageView.

这方面的一个示例是搜索屏幕,用户在其中搜索、获取结果并显示每个结果的图片。

我正在尝试权衡实施全局LruCache与每个都Activity包含自己的本地的成本/收益LruCache的成本/收益。

这是我的两个主要问题。两者都围绕着我的应用程序非常大的事实,这意味着有很多屏幕显示这些图像。此外,我的应用程序具有流行的侧边菜单导航方式。正因为如此,我可以打开菜单,点击Activity B,打开菜单,点击Activity A,打开菜单......等等,并Activity无限期地创建一个 ABABABABABABAB 堆栈。

全球的

Activitys with ImageViews using Bitmaps from a global不会LruCache包含对这些的引用Bitmaps吗?假设用户Activity通过单击 some离开此位置Button。那Activity现在在Activity堆栈上,并且仍然保存对那些Bitmaps. 如果LruCache弹出一个Bitmap关闭,当堆栈中的某个in持有对它的引用Bitmap时,它真的可以被回收吗?ImageViewActivity

我之前创建了自己的自定义缓存。如果我调用recycle()a Bitmap,然后用户点击后退按钮返回到Activity堆栈中包含对 that 的ImageView集合的某个位置Bitmap,则应用程序将崩溃。这就是为什么我相信堆栈上的ImageViews 上Activity的 s 仍然持有对Bitmaps 的引用。

当地的

正如我之前提到的。我的应用程序非常大,侧边菜单样式的导航允许用户创建相当大的Activity堆栈。这会产生很多LruCaches。而且,由于您必须在LruCache初始化时声明它的大小,因此似乎没有任何选择大小的好方法。

想法?建议?

此时我想我必须做全局,但我不知道如何解决Activity堆栈引用问题。我无法想象这不是许多应用程序都没有遇到的问题。我不知道为什么我没有找到有关它的信息。

4

1 回答 1

3

我试图权衡实现全局 LruCache 与让每个 Activity 包含自己的本地 LruCache 的成本/收益。

Global LruCache 是前进的方式,因为同一组位图可能在不同的活动实例中被引用。LruCache 可以定义为Application的一部分。如果活动堆栈可以托管同一活动的多个实例(如 ABABABAB..),那么在该活动中本地创建 LruCache 将是一个坏主意。很快就会出现内存不足的情况,因为每个活动实例中的 LruCache 都会在 Dalvik VM 中保留定义的内存量。假设,应用程序内存为 32Mb,而您决定 LruCache 大小为 4Mb,即 1/8。现在当我们创建了将近 7 个 Activity A 实例时,内存消耗会达到 7*4=28Mb,这本身就有可能触发 OOM。

使用全局 LruCache 中的位图的 ImageView 的 Activity 不会包含对这些位图的引用吗?

是的 ImageView 也将对位图有很强的引用。如果在 LruCache 中维护引用,那么此时引用计数将为 2。

如果 LruCache 弹出一个 Bitmap,当堆栈上的某个 Activity 中的 ImageView 持有对它的引用时,该 Bitmap 真的可以回收吗?

不,不能回收位图内存,因为仍然有一些 ImageView 对它有很强的引用。

此时我想我必须做全局,但我不知道如何解决Activity堆栈引用问题。

LruCache 的主要作用是对使用比较频繁的位图进行强引用。因此,如果任何 ImageView 都没有强引用,则防止位图被垃圾收集。

还要记住,对于 Android 2.3.3 及更低版本,您需要实现引用计数机制,以便回收位图。

于 2014-09-03T00:50:05.043 回答