【问题标题】:Android - Save instance state in Application instance (TransactionTooLargeException )Android - 在应用程序实例中保存实例状态(TransactionTooLargeException)
【发布时间】:2016-09-29 12:01:34
【问题描述】:

如果包裹大小超过限制,Android 7.0 在恢复实例状态时开始抛出 TransactionTooLargeException。

但我的应用程序必须保存没有大小限制的加载内容。 所以很容易导致这个错误。

在Application实例中保存实例状态安全吗?

Activity在后台时会被删除吗?

有没有办法保存大数据而不抛出这个异常?

【问题讨论】:

  • 由于我们不知道存储数据的性质,所以会有很多选择。在 SharedPreferences/File/etc 支持的保留 Fragment 中使用 Loader 或 SharedPreferences 或变量。
  • 我必须保存我的应用从服务器下载的数据。并且数据将被解析成一些复杂的对象。在这种情况下,既不能使用 Loader 也不能使用 SharedPreferences。并且在Android杀死我的应用程序后片段将被销毁,在这种情况下保留的片段如何工作?我真正想知道的是,当应用被Android杀死时,如何保存大数据并恢复它?
  • 当你的应用程序被杀死时,它并不存在于内存中。所以任何数据都必须从持久模型/存储中加载。您的数据集应保存在硬盘上并根据需要加载到对象中。保存状态不是保留整个模型的工具。
  • 你的意思是每次调用 onSaveInstanceState 时我都必须将它保存到数据库或缓存中?
  • 一点也不。每次从 Internet 获取数据时,您都会将其保存到存储中,并且每次存储中的数据更改时,您都会将更改广播到 ui。您的数据模型永远不会触及已保存的状态。

标签: android android-lifecycle android-7.0-nougat onrestoreinstancestate onsaveinstancestate


【解决方案1】:

一一回答这些问题:

  • 在应用实例中保存实例状态是否安全?

如果想要在您的应用程序的进程被操作系统杀死并稍后恢复后检索该数据,则不需要。为此,您需要以某种方式将数据持久化到磁盘。正确处理保存状态总是有两个部分:处理配置更改(如轮换),这涉及进程死亡和实际进程死亡和恢复。将状态放入 Application 实例(或任何单例)中可以解决第一个问题,但不能解决第二个问题。

  • Activity 在后台时会被删除吗?

取决于您所说的“在后台”是什么意思。这有时可能意味着“活动存在但处于停止状态”。在这种情况下,您的数据很好。但是您的整个应用程序进程可能会在应用程序处于后台时被终止,然后在您返回时恢复。在这种情况下,如果您的数据没有正确保存到某个地方的磁盘,您的数据就会消失。

  • 有没有办法保存大数据而不抛出这个异常?

是的,将其写入数据库并从那里恢复数据。或者,您可以使用这个库来自动为您处理持久化/从磁盘恢复您的捆绑包:https://github.com/livefront/bridge

【讨论】:

  • 虽然两年前我已经解决了所有这些问题,但仍然感谢您的回答。不知道有一个用于处理 Android 限制的库。我现在正在从 Realm 数据库中恢复数据。
  • 没问题。使用 Realm 数据库是一个不错的选择。
猜你喜欢
  • 2012-05-24
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多