android - 实现全局 LruCache 与许多本地 LruCache

标签 android imageview android-lru-cache

我的应用程序中的多个 ActivityListView 中显示图像,其中 ListView 的每一行都包含一个 ImageView.

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

我正在尝试权衡实现全局 LruCache 与让每个 Activity 包含其自己的本地 LruCache 的成本/ yield 。

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

全局

使用来自全局 LruCacheBitmapActivityImageView 不会包含对这些的引用位图?假设用户通过单击某个 Button 离开此 Activity。该 Activity 现在位于 Activity 堆栈中,并且仍然保留对那些 Bitmaps 的引用。如果 LruCache 弹出一个 Bitmap,那么当 ImageView 在某些 中时,那个 Bitmap 真的可以回收吗堆栈上的 Activity 持有对它的引用?

我之前创建了自己的自定义缓存。如果我在 Bitmap 上调用了 recycle(),然后用户点击后退按钮返回到堆栈上的某个 Activity,其中包含ImageView 设置为那个 Bitmap,应用程序会崩溃。这就是为什么我相信堆栈上 Activity 上的 ImageView 仍然包含对 Bitmap 的引用。

本地

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

想法?有什么建议吗?

此时我觉得我要做global,但是我不知道如何解决Activity栈引用问题。我无法想象这不是许多应用程序都没有遇到过的问题。我不知道为什么我找不到相关信息。

最佳答案

I'm trying to weigh the cost/benefits of implementing a global LruCache vs having each Activity contain its own local LruCache.

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

Won't Activitys with ImageViews using Bitmaps from a global LruCache contain references to these Bitmaps?

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

If the LruCache pops a Bitmap off, can that Bitmap really be reclaimed when an ImageView in some Activity on the stack holds a reference to it?

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

At this point I think I have to do global, but I don't know how to solve the Activity stack reference problem.

LruCache 主要作用是持有对使用频率较高的位图的强引用。因此,如果任何 ImageView 都没有强引用,位图就不会被垃圾回收。

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

关于android - 实现全局 LruCache 与许多本地 LruCache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25628734/

相关文章:

Android - 创建自定义形状按钮的可能方法?

android - 我想编写一个 ImageView 先缓慢旋转然后逐渐增加旋转速度的程序

java - 使用 get 时 LRUCache 条目重新排序

java - Android 抛出 IndexOutOfBound 异常

Android canvas drawText 文本的y位置

Android - this.cordova.getActivity().getApplicationContext() 的空指针异常

java - 从 baseActivity android 调用一个函数

android - 在android中动态地将布局添加到适配器的getview方法中

android - NoSuchMethodError 在 Android 中使用 LruCache