如何在Android中收集垃圾时,如何在共享首选项中保留静态成员

Bha*_*r R 4 java android garbage-collection android-sharedpreferences

我在Utility类中有一个静态成员,可以从我的大多数活动中访问它来存储历史信息.我希望在Utility类即将被GC时保持这个静态成员.我试过以下选项.

  1. finalize()方法实现:

我已经覆盖了Utility类的finalize()(我知道并不总是保证finalize()会运行)来保持静态成员Shared Preferences.But finalize()根本没有被调用!

  1. 在每个活动中实现onDestroy()以持久化静态成员

我开始实现onDestroy()所有可以访问此静态成员的活动,当每个活动即将被销毁时,静态成员将被保留SharedPreference.这是有效的,但写入共享首选项的情况经常发生,导致我想避免不必要的持续重复.

有没有更好的方法来做到这一点?

tyn*_*ynn 10

不要开始实施糟糕的自定义实践.考虑到文档onPause(),这是您应该保留数据的地方.

此回调主要用于保存活动正在编辑的任何持久状态,向用户显示"就地编辑"模型,并确保在没有先杀死此活动的情况下没有足够的资源来启动新活动时不会丢失任何内容.这也是一个很好的地方,可以停止动画和其他消耗大量CPU的事情,以便尽快切换到下一个活动,或者关闭独占访问的资源,如摄像头.

在系统需要更多内存的情况下,它可能会杀死暂停的进程以回收资源.因此,您应该确保在从此函数返回时保存所有状态.通常onSaveInstanceState(Bundle)用于保存活动中的每个实例状态,此方法用于存储全局持久数据(在内容提供者,文件等中)

您没有任何保证,对于任何方法,您都将达到存储数据的程度.

考虑到您的Utility类只有静态方法和成员,并且您永远不会创建它的实例,因此finalize()永远不会调用它.如果您正在使用Utility类的实例,只需将存储保留在您希望最后可以访问的位置.

考虑使用onDestroy()也不是一个好主意.文档明确说明了这一点.

注意:不要指望这种方法被称为保存数据的地方!例如,如果一个活动是在内容提供商编辑数据,这些修改应该在致力于要么onPause()或者onSaveInstanceState(Bundle),不是在这里.通常实现此方法是为了释放与活动相关联的线程之类的资源,以便在其应用程序的其余部分仍在运行时,被破坏的活动不会留下这些东西.在某些情况下,系统会简单地杀死活动的托管进程,而不会在其中调用此方法(或任何其他方法),因此它不应该用于执行在进程消失后保留的内容.