2013-09-28 65 views
3

我正在编写同时具有“活动”和“服务”组件的Android应用程序。此外,我有一个封装了一个资源的类,我在活动和服务的几个地方共享资源。我的问题是我如何确定何时释放资源。据我了解,Java没有析构函数的概念,所以我不能只在共享对象中创建一个析构函数,当没有更多的对象引用时将会调用它。 Android具有诸如Activity的onPause和Service的onDestroy之类的功能,尽管技术上不能保证在所有可能的关闭情况下(例如低内存杀手都不会调用这些函数)这些函数都会被调用。在任何情况下,活动都可能被销毁而不会破坏服务,在这种情况下,仍然可能会引用该资源,所以我不能在这种情况下盲目释放资源。由于Java没有析构函数,因此有些源表示创建自己的“close()”类型函数并手动调用它。但似乎这样工作,我将不得不维护自己的引用计数方案,考虑到Java已经具有GC而不需要这种方案,这似乎相当奇怪。释放Android应用程序中的共享资源

这里有什么合适的解决方案?

+0

你的问题描述不清楚。请更详细地描述共享资源的含义。是内存还是持久对象?什么是服务器组件?它是在设备上运行的东西吗?或在远程位置的东西? – minhaz

+0

对不起,我的意思是在android.app.Service中的服务。共享资源是一个抽象,由各个类共享一个实例(通过持有相同的引用)和(Java)同步以阻止并发访问的类表示。 – Michael

+0

听起来像你来自C的世界。不需要这些类型的Java释放内存。当没有对象的引用时,我们有一个垃圾收集器为我们这样做。 – cYrixmorten

回答

2

答案是否定的。

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

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

只要你创建了一个有点理智的代码,你会没事的。 不要恐慌

+0

+1 for *不要恐慌* – andy256

0

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

0

Java没有析构函数,但finalize()是他们与每个对象哪种工作像析构函数。

对于标准内存对象不用太担心,java会自动销毁那些未在其他类中引用的对象。这与Android和它的标准Java内容没有任何关系。

如果你有昂贵的资源,这是昂贵的创建,你可能会想到使用serealizable在磁盘上坚持它。如果你不想坚持,你可以考虑Java引用长时间保持它的活跃。在这种情况下,您还可以考虑使用单例设计模式对昂贵的对象进行更多的控制。这些都与标准的Java垃圾收集相矛盾,其中GC销毁未被主动引用的对象。

当您的对象从活动跳转到活动时,请确保此类对象与任何活动保持分离,并且不保留对不可见活动的引用。由于所有这些视图对象的活动对于Android来说太大了,以至于它们在不可见时特别随身携带。

但是,旧版本的Android版本在原生图层上分配了位图内存,它们不会在没有调用回收的情况下进行垃圾回收。

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