3

我正在编写一个同时具有 Activity 和 Service 组件的 Android 应用程序。此外,我有一个类封装了我在 Activity 和 Service 的多个地方共享的资源。我的问题是如何确定何时释放资源。据我了解,Java 没有析构函数的概念,因此我不能只在共享对象中创建析构函数,当不再引用该对象时将调用该析构函数。Android 具有诸如用于 Activity 的 onPause 和用于服务的 onDestroy 之类的函数,尽管从技术上讲,不能保证在所有可能的关闭情况下都会调用这些函数中的任何一个(例如,低内存杀手不会调用这些函数)。而且无论如何,

由于 Java 没有析构函数,一些消息来源说要创建自己的“close()”类型函数并手动调用它。但似乎要让它工作,我必须维护自己的引用计数方案,考虑到 Java 已经有了 GC,这应该消除对这种方案的需要,这似乎很奇怪。

这里的正确解决方案是什么?

4

3 回答 3

2

答案是不。

您必须记住自己清理诸如关闭文件等之类的东西,但是即使没有进行适当清理的对象也很少会导致内存泄漏,因为如果 GC 将它们扫走,它们将无法执行任何操作或占用空间。它会的,除非你明确地做一些事情来保持它的活力。

在我看来,唯一值得关注的地方是静态对象,调用 C 代码并在类之间传递巨大的对象。如果你做大量的意大利面条、循环引用、代码,风险是 GC 不会收集对象,因为仍然有对它们的引用。

只要您创建一些理智的代码,就可以了。不要恐慌

于 2013-09-28T21:46:49.743 回答
0

像 c# 这样的 Java 是一种托管语言,而不是 c。它实现了负责管理对象的垃圾收集。当一个对象不再需要时,它将被自动销毁。不关心手动释放内存。

于 2013-09-28T21:23:32.200 回答
0

Java 没有析构函数,但finalize()对每个对象都有类似析构函数的作用。

对于内存中的标准对象不要太担心,java会在另一个类中没有引用时自动销毁那些。这与 Android 和标准 Java 无关。

如果你有昂贵的资源,创建起来也很昂贵,你可能会考虑使用 serealizable 将它持久化到磁盘上。如果你不想持久化,你可以考虑 Java 引用来让它保持很长时间。在这种情况下,您还可以考虑使用单例设计模式来更好地控制昂贵的对象。这些都与标准 Java 垃圾收集相矛盾,其中 GC 会破坏未主动引用的对象。

当您的对象从一个活动跳到另一个活动时,请确保此类对象与任何活动保持分离,并且不持有不可见活动的引用。对于所有这些视图对象,活动对于 Android 来说太大而无法在它们不可见时特别携带。

然而,在较旧的 Android 版本上,位图内存分配在本机层上,如果不调用回收,它们不会被垃圾收集。

如果您创建一个绑定服务并将您的对象保留在该服务上,只要保持活动连接,Android 就会使该服务保持活动状态。

于 2013-09-28T22:24:21.250 回答