2

在我的应用程序中,我想在第一次需要时将一些数据加载到内存中,并将其保留在那里以防应用程序的另一部分想要使用它。可以从几个不同Activity的 es 访问相同的数据,但到目前为止,并非所有用户都可以与之交互。因此,当不使用我的应用程序的相关部分时,我希望 Android 可以随意丢弃数据,并在需要时重新加载它们。请注意,我无法预测用户会做什么,所以我希望 Android 仅在一段时间未使用时才释放数据。这样做的好方法是什么?

我想创建一个class仅静态使用的,将数据加载到其静态初始化块中。但是,我不确定 Dalvik 是否会丢弃以这种方式存储的任何静态数据。我已经阅读了一些关于类加载器的内容,但我不知道在加载我的类时使用了什么加载器以及它如何可能被丢弃。也许有人...?

我想出的另一种方法是使用弱引用来保留数据保存类的实例(显然是非静态的)但在这里我担心 GC 可能会在 noActivity当前正在积极操作它时决定它是无用的,即使当内存在那一刻没有关系。(在这种情况下,我想保持加载数据。)

我的数据加载成本很高。如果可能,我希望在系统内存不足或应用程序退出时销毁它。

4

3 回答 3

3

您可以使用软引用。看一眼:

http://docs.oracle.com/javase/6/docs/api/java/lang/ref/SoftReference.html

使用 SoftReferences,您可以实现您所需要的:“如果可能,我希望仅在系统内存不足或应用程序退出时销毁它。”

于 2013-01-02T01:24:56.827 回答
3

听起来SoftReferences是您所需要的。当垃圾收集器检测到内存不足时,它们会自行清除。

如果您阅读类 javadoc,它会提供一些关于如何防止最近使用的缓存条目被回收的提示。


作为记录,类加载器不会帮助您管理类的实例。但是,static如果缓存类被卸载,则将缓存设置为 a 应该允许丢弃缓存的对象。


跟进

我的数据是一个实体块,将由单个对象表示。

这反而改变了事情。如果你有一个对象要缓存,那么 LRU 就没有意义了。基本上听起来你想尽可能长时间地挂在对象上......而不会因为挂在对象上太久而触发 OOME。这有点难。确实,做一个完美的工作需要正确地预测用户将要做什么……这显然是不可能的。

可能最好的策略是利用引用入队机制,并实现队列处理器以在让对象死亡或重新创建软链接之间做出“智能”选择。“智能”可能需要查看有多少可用内存,和/或自上次使用对象以来的时间。但要小心!!如果你弄错了,你可能会导致 OOME 或导致平台花费大量时间来破坏垃圾收集器。

如果我将缓存设置为保存 1 个对象,这将等同于硬引用,不是吗?

没有。如果您使用SoftReferenceGC 将在内存不足时破坏引用。

于 2013-01-02T01:30:35.103 回答
2

看看 SoftReference 太早收集垃圾

如果您希望在应用程序的内存中缓存一些数据,您也可以查看 LruCache。 http://developer.android.com/reference/android/support/v4/util/LruCache.html

对于更长寿命的基于磁盘的缓存,请查看Android Objects Cache

您可以在https://github.com/JakeWharton/DiskLruCache/找到DiskLruCache

于 2013-01-02T01:37:49.997 回答