【问题标题】:Persistent field in Android serviceAndroid服务中的持久字段
【发布时间】:2009-08-06 16:14:43
【问题描述】:

我需要在我的服务中保留一个复杂的对象,以便我可以可靠地返回它(它保存更新)。最初我将它编码为我的服务实现中的一个类,但我观察到更新对象会定期重置为 null,这告诉我服务器类本身已重新创建。有人可以推荐轻量级可靠策略来保存和重新创建此类更新对象(我可以使其可序列化)

【问题讨论】:

    标签: android serialization persistence


    【解决方案1】:

    当您的服务重新启动时,将调用 onStop()onStart() 方法。您可以使用 onStop() 方法将数据保存到持久位置,例如应用程序sqlite 数据库。调用onStart()时可以恢复数据。

    您可以在 android 开发人员 website 上阅读有关使用 sqlite 数据库的信息。

    【讨论】:

    • 我认为问题不在于 onStop 和 onStart 而是事实上,为了提供这些方法,Android 可能会创建一个新的类实例。我真的不想走 sqlite db 路线,因为这将是已经很昂贵的处理的另一笔费用。我正在研究序列化/反序列化以获得更轻的替代方案
    • 在 onStop() 被调用后,你的服务实例将被杀死。这就是调用该方法的原因:一种或另一种方式,您需要将数据保存在这里。如果不想使用数据库,可以使用 Context.openFileOutput() 保存文件。您可以稍后使用 Context.openFileInput() 阅读它(例如,当调用 onStart() 时)
    • 所以遵循这条路线:如果我的服务类中有一个字符串,那么在 onStart/onStop 上读/写它似乎更有效,否则将其用作类字段而不是读/写每次需要变量时将其添加到 SharedProperties
    • 我知道已经有一段时间了,但是在 onStop() 方法(或现在使用的 onDestroy() 方法)中保存数据并不可靠,因为并不总是保证调用该方法如果系统内存不足。只是给那些偶然发现这个问题的人的注释。
    • android.app.Service 没有 onStop() 方法,onStart(android.content.Intent, int) 已被弃用。
    【解决方案2】:

    如果我这样做,我会使用 SharedPreferences。如果它太复杂了,我同意@Scharrels 关于使用 sqlite DB(这很可能是谷歌的建议,因为他们的示例在最小的情况下使用 sqlite,这意味着它具有合理的性能水平)。

    我发现 SharedPreferences 在许多情况下都很有用。首先,作为键值对存储,可以轻松存储各种不同的数据,此外,如果需要,您可以将对象编码为字符串,并将它们存储在单个字段中。其次,您可以使用多个 SharedPreference 存储,只需检索具有不同名称的存储(同时仍保持它们私有)。最后,我发现它们很容易使用,因为获取数据和存储数据实际上只是几行代码(不包括您可能需要的任何数据转换或序列化)。

    【讨论】:

    • 请记住,SharedPreferences 存储在 XML 文件中,因此无法保证事务性。
    • 当然。而且,根据需要持久化的对象的实际复杂性,可能不如小型 sqlite 数据库效率高。然而,与现有的无解决方案相比,编码方面的东西可以非常快地为持久性做好准备。从好的方面来说,onDestroy() 中的持久性将完成,因为允许在进程被终止之前完成。
    • 马克。为了完全磨练我想要坚持的是 HtmlClient 的实例,可能还有一些派生对象。这些相当复杂,可能无法序列化。为什么?例如,HttpClient 使用一些我需要保留的 cookie 进行初始化,以便成功继续在某些应用程序服务器上为我创建的会话。我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2012-01-22
    相关资源
    最近更新 更多