我正在编写一个同时包含Activity和Service组件的Android应用程序。此外,我有一个类封装了一个资源,我在Activity和Service上的几个地方共享。我的问题是如何确定何时释放资源。据我所知,Java没有析构函数的概念,所以我不能只在共享对象中创建一个析构函数,当没有对该对象的引用时将调用该析构函数。 Android具有诸如用于Activity的onPause和用于服务的onDestroy之类的功能,尽管从技术上讲,不能保证在所有可能的关闭情况下都会调用这些函数中的任何一个(例如,低内存杀手不会调用这些函数)。在任何情况下,都可以在不销毁服务的情况下销毁Activity,在这种情况下仍然可以引用资源,因此我不能盲目地在这种情况下释放资源。
由于Java没有析构函数,一些消息来源说要创建一个自己的“close()”类型函数并手动调用它。但似乎这个工作我必须保持自己的引用计数方案,考虑到Java已经有GC,这应该消除对这种方案的需要,这似乎很奇怪。
这里有什么合适的解决方案?
答案 0 :(得分:2)
答案是否定的。
你必须记得自己清理诸如关闭文件之类的东西,但即使是没有进行适当清理的对象也很少会导致内存泄漏,因为如果GC扫除它们,它们就无法执行任何操作或占用空间。除非你明确地采取措施保持活力,否则它将会发生。
在我看来,唯一可以关注的地方是静态对象,调用C代码并在类之间传递大对象。如果你做了相当数量的意大利面,循环引用,代码,风险是GC不会收集对象,因为仍然有参考它们。
只要你创建一些理智的代码,你就可以了。 请勿恐慌
答案 1 :(得分:0)
答案 2 :(得分:0)
Java没有析构函数,但finalize()是他们的每个对象都像析构函数一样工作。
对于内存中的标准对象不用太担心,java会在另一个类中没有引用时自动销毁那些。这与Android及其标准Java内容无关。
如果你有昂贵的资源,创建起来很昂贵,你可能会想到使用serealizable将它保存在磁盘上。如果你不想坚持下去,你可以考虑使用Java引用来让它保持很长时间。在这种情况下,您还可以考虑使用单例设计模式来更好地控制昂贵的对象。这些都与标准Java垃圾收集相矛盾,其中GC销毁对象未被主动引用。
当您的对象从活动跳转到活动时,请确保此类对象与任何活动保持分离,并且不保留对不可见活动的引用。对于所有这些视图对象,活动对于Android来说太大了,特别是当它们不可见时。
然而,在较旧的Android版本上,在本机层上分配的Bitmap内存并不会在不调用回收的情况下进行垃圾回收。
如果您创建绑定服务并将对象保留在该服务上,只要活动连接保留,Android就会保持该服务的活动状态。