【问题标题】:Persist object when changing Activity更改 Activity 时保留对象
【发布时间】:2017-08-21 03:51:33
【问题描述】:

我目前在 Android 应用程序中遇到持久对象状态的问题。
我有某种多级主从流程。
例如,我有一个Clients 的列表。每个Client 有多个Orders,每个Order 有多个Articles。
到目前为止,我做了以下事情:
- 当您单击MasterActivity 中的Client 时,我将Client 写入Bundle 并打开DetailActivity
- 在DetailActivity 中,我从Bundle 中读取Client 并显示它。

这在大多数情况下或多或少都很好,但是现在发生了,对象太大而无法序列化(例如,Client 带有很多 Orders)。

因此,我只想序列化Client 的ID,并从DetailActivity 内的数据库中加载它。通常这种方法效果很好,但我有一种情况它不起作用:

只有当您保存Order(他们的Master)时,Articles 才会被保存。因此,如果您为 Order 创建新的 Article 并且不保存 Order,则 Article 也不会保存。
这意味着,我总是需要拥有完整的对象,从DetailActivity 中的数据库重新加载它意味着我丢失了所有未保存的更改。但是,使用Bundles 持久化它可能会超出限制(500kB to 1MB)。

所以我的问题是,保存此类数据的首选方式是什么?

【问题讨论】:

    标签: android android-intent android-activity serialization


    【解决方案1】:

    更好的方法是创建自己的单例类,该类指向要在活动之间传输的数据。

    我建议 DataManager 单例活动有 Article articleToPass 让 setter 将 articleToPass 设置为指向您想要的任何内容。 而 getter 或 reader 将读取 fetch the article 并使 articleToPass 无效。

    使用此 DataManager 单例管理您的应用数据(此 dataManager 单例可以在扩展的 Application 类或 MainActivity 中初始化)。

    如果您必须在应用程序被销毁并重新加载时保留该对象:

    1. 从 Article 对象创建一个数据库条目,其中包含您需要的所有数据(我认为没有理由在此处保存您不需要的数据)
    2. 将所有数据转储到某个文件(使用共享首选项、键和值)
    3. 进入“详细信息”屏幕时,您希望通过 ID 或其他方式向您的服务器请求您需要的所有数据。
    4. 将您需要的所有对象转换为 JSON(只需使用 GSON),并将 JSON 转储到文件中,并在需要时加载。

    我认为上面的解决方案已经足够了 :) 希望对我有所帮助

    【讨论】:

    • 感谢您的解决方案,但我想它与@alexanderkulyakhtin 的解决方案会有同样的问题。当应用程序被销毁时,我会丢失所有数据吗?
    • 更新了我的答案
    • 感谢您的更新。我会考虑解决方案并尝试实施最适合的解决方案。谢谢
    【解决方案2】:

    您可以从Application 继承您自己的MyApp 类,并在清单中指定它。这个类是一个单例,并且在 android 应用程序像这样(MyApp)getApplication() 运行时始终可用。

    因此,在此类的字段中,您可能会保留一些您需要在活动之间保留的临时数据。

    您必须检查此字段是否不是null,因为操作系统可以随时终止您的应用程序。在这种情况下,您将不得不重新加载数据。您可以在SharedPreferences 中的某处保留要重新加载哪些数据的索引。

    【讨论】:

    • 感谢您的解决方案。当用户切换应用程序并且 Android 决定销毁我的应用程序时,我会丢失所有数据对吗?如果是这样,在这种情况下你将如何持久化数据?
    • Android 可以随时终止应用程序,因此您无论如何都必须将数据保存在 SQL Db 或 SharedPreferences 中。这个解决方案只是让你不要把大数据放在 Bundle 中,因为你几乎总是会通过 Application 引用它们。而且,如果您的程序被杀死,您将使用您在 SharedPreferences 中单独保存的某个 id 恢复最新数据,例如
    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    相关资源
    最近更新 更多