【问题标题】:Persisting state in the android Application class在 android Application 类中持久化状态
【发布时间】:2012-09-29 11:17:55
【问题描述】:

我正在开发一个包含 10 多个活动的 Android 应用程序。我有一些状态对象,我几乎在每个活动中都可以访问它们,为此,它们在 MyApplication 类中实现为全局静态变量。

我注意到,只要用户“在”应用程序中,这种方法就可以了。但是,当他按下主页按钮并打开另一个应用程序,然后通过“最近的活动”按钮返回我的应用程序时,我看到 Android 系统从 MyApplication 重置了静态,所以我必须处理 NullPointerExceptions。我知道这种行为是由Android杀死并重新创建应用程序进程引起的。

我知道保存此类数据的最佳方法是使用 SharedPreferences 或 SQLite,并且我在 onCreate for 中检查 MyState==null 并恢复它没有问题,但问题是我不知道when 正确存储我的状态对象(在首选项或数据库中)。我试图覆盖 MyApplication 的 finalize() - 不好,我看到 onLowMemory 可能不会被调用,我不知道如何使用 onPause、OnStop 等,因为我有太多的活动,序列化反序列化会相当多减慢应用速度。

有什么想法吗? 提前致谢!

【问题讨论】:

  • 如果数据量不大,请将持久化对象设为 Singleton。
  • 那么当Android OS会重新创建应用进程,因此重新创建Application类这个Object会恢复它的状态?
  • 重新启动/重新创建应用程序进程取决于几个因素,例如内存、实时应用程序数量、当前运行的服务数量等。因此,将您的数据保存在销毁的主要活动中或销毁的应用中。
  • 好点,但根据此处的文档link,一般建议是:“不要指望此方法被称为保存数据的地方”。据我了解,无法保证此方法会被调用。
  • 确实如此,但很少发生。如果您想要更多控制权,请在暂停的活动中的适当时间保存数据,保存在已保存的实例方法上。

标签: android object-persistence


【解决方案1】:

最好不要依赖Application 类,除非您需要在启动其他任何操作之前加载一些数据。 Android 可以随时终止您的进程以释放资源,因此您的应用应该能够处理此问题。将所有数据保存在 snigleton 类中,然后延迟加载——检查 null,如果是,则在首次访问时加载。如果状态需要保持不变,请考虑将其保存为文件/共享首选项。如果没有,您的应用可能没有它也可以生存,因此请确保检查 null 等。

通常,当活动变为非活动状态时,您应该保持状态——onStop()onPause(),但您可以在有意义时立即保存(例如,用户输入了所有必需的数据)。分拆AsyncTask 以在后台保存数据并让用户继续工作。

【讨论】:

  • 这一切都说得通,但这里我们讨论的是一个有大约 10 个输入屏幕的应用程序(要求用户输入数据)。所有信息都存储在一些状态对象中,这些状态对象用于在此流程结束时执行某些任务。每次其中一个活动进行 onPause 或 onStop 时,这是运行某种 SaveAsyncTask(将数据保存在文件/首选项等中)的最佳做法吗?
  • 如果您有 10 个屏幕,您可能应该检查您的设计。如果您希望用户能够从他们离开的地方继续,最好在每次屏幕转换时保存状态。
  • @NikolayElenkov 你在哪里挂/声明你的单例类?您应该使用 Application 类做什么?
猜你喜欢
  • 2011-05-11
  • 2011-01-09
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 2019-08-30
  • 2021-10-17
相关资源
最近更新 更多