2015-10-16 49 views
1

我正在尝试使用一个静态单例DataManager,它为我的Activity创建网络请求并保存数据数组,在我的Activity的onCreate()类中实例化,但活动每次都会被销毁是一个方向的变化正在绊倒我。我不想重新创建一个新的单例,并且每次用户更改方向或返回到屏幕时都会重新填充数据。Android中的单身人士活动和服务生命周期

即使我将DataManager设置为服务,如果我将其设置为绑定服务,每当我的活动被破坏时,服务似乎都会被销毁,但如果我没有将其绑定服务并使用startService()stopService()在我的Activity中,只要我的Activity被破坏,它也会被销毁。另外,如果我使用onSaveInstanceState()onRestoreInstanceState()来保存我的单例实例,当我的Activity处于非活动状态时,有可能我的单例会被销毁,因为不再有指向它的指针。然后使用相同DataManager类的Activity B可以创建另一个DataManager实例,而Activity A处于非活动状态。然后活动A唤醒,使另一个数据管理器膨胀,给我们2个不再是单身的DataManagers,并且可能有不一致的数据。

我已阅读elsewhere我不应该继承应用程序来维护应用程序状态,但我不明白它如何以其他方式工作。谢谢你的澄清。

回答

0

子类应用程序类,然后在application.onCreate()回调中实例化你的单例。这样它将在您的应用程序的整个生命周期中可用,而不是单个活动的生命周期。小心这不会垃圾收集,直到有人杀死你的应用程序,所以不要有太多的“全球”单身人士。

+0

请记住,如果框架在最后一次活动退出后仍然保留处理过程,那么'Application'实例将保持不变,并且下次启动应用程序时不会再调用同一个实例,的onCreate()'。 –

+0

我的理解是,如果应用程序被终止并且使用不再有效的指针恢复活动,则可能会导致NullPointerException异常:[请参阅此博文](http://www.developerphil.com/dont -store-数据内式应用对象/)。 – newt

+0

这里是对最佳实践的讨论(而不是在这里重复它们)http://stackoverflow.com/questions/14057273/android-singleton-with-global-context – FriendlyMikhail

0

不要做的工作在Application.onCreate()。无论发生什么情况,您都会减慢应用程序的启动速度。对于Android应用程序不建议这样做,您希望您的应用程序及时启动。如果你真的需要一个单身人士,在必要时让它构造得很懒惰(如果你确定你会使用它,你也可以在你的活动开始时从一个单独的线程异步强制构造)。当你的活动被破坏时,并不意味着整个过程会立即被拆除,所以你的单身将会保持活力。

此外,如果您使用的是单身人士,请务必在内存不足时将其清除。您需要执行Application.onTrimMemory(int)并从那里清除单身人士。

+0

问题是,即使这个过程很可能不会被拆除,但不能保证操作系统不会杀死它,并杀死单身人士。我不能在子类化的Application类中异步构造单例,所以它不会减慢应用程序的启动速度? – newt

+0

你永远不能保证这个过程不会被杀死(这就是我的意思是说,拆除),所以你需要编写你的应用程序以正确处理。您可以保留单身人士,好像它被缓存以提高性能,当有大量内存时,但是您还需要考虑内存稀少的情况,并且在使用完成后您的进程不会停留很长时间。 – gruszczy

+0

您可以在子类应用程序中构建单例,但是无论如何,您将减慢应用程序启动,因为单独的线程和主线程将争夺资源。 – gruszczy