【问题标题】:Retain singleton instance after thrown exception抛出异常后保留单例实例
【发布时间】:2014-12-26 05:45:42
【问题描述】:

我创建了一个使用单例来保存其状态的 Android 应用程序。该类在应用程序启动时被实例化。

该应用程序确实大量使用了 Fragment,但不是单个 Activity 应用程序。

当活动因某种(任何)原因而崩溃时,就会出现问题。

通常,Android 会关闭 Activity,将前一个处于活动状态的 Activity 置于前台。由于之前的活动也以某种方式使用了单例,因此它需要从中恢复数据(例如)。问题是,当先前的活动在新的应用程序上下文中运行时,单例不再可用,这迫使单例在没有数据的情况下重新实例化自己。

解决这个问题的一种方法似乎是将状态(序列化或非序列化)存储在文件或数据库中,但这意味着几乎所有其他用户活动都应该避免过多的读写操作。除了 UX,此解决方案可能会因同步错误或不及时同步而导致数据不一致或错误。

我想听听您对此事的意见。 干杯!

这里是单例实例化方法。

final public class Data {
    private static Data INSTANCE = new Data();

    private Data() {}

    public static Data getInstance() { 
        return INSTANCE; 
    }
}

【问题讨论】:

  • 你如何实例化你的单例?贴一些代码。
  • 你不能用 sharedpreferences 代替吗?
  • @localhost 你去。
  • @Poutrathor 需要保存的数据很多,所以我不喜欢这个主意。但作为最后的手段,它会是这样的......
  • 对于那些投反对票的人,请善待并详细说明您的决定。如果问题有问题,我很乐意修复它(并从过程中学习)

标签: android android-activity exception-handling singleton


【解决方案1】:

1) 您可以使用Application 类。到最后阶段就会被销毁。

2) 如果您的数据不是结构化的 - 您可以将其保存在 SharedPreferences 中(例如,作为与 JSON 映射的字符串)

3) 如果您的数据是结构化的 - 您应该将其存储在 DB(或更好的 ContentProvider)中

【讨论】:

    【解决方案2】:

    如果您在根活动上将单例声明为静态,则应将其保存。我们使用与基线活动相关联的静态变量,每个活动都从该活动派生。

    另一个解决方案可能是使用共享首选项。

    担心性能很好,但如果你有很多片段和很少的活动,那么片段将导致大部分工作量

    【讨论】:

      猜你喜欢
      • 2012-09-12
      • 2021-02-04
      • 2013-02-17
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      相关资源
      最近更新 更多