注意:虽然到目前为止(9 月 6 日)提供的两个答案很有趣,但不幸的是它们没有解决这个问题。
我的 Android 测试设备之一是 HTC One X。该设备以经常杀死后台应用程序而闻名(甚至包括启动器,最令人气愤的是),因为它在 RAM 分配方面往往处于边缘地位,可能是由于 HTC 膨胀软件。然而,就我的目的而言,这非常有用,因为它有助于突出各种低内存情况的影响,并允许我改进我的应用程序以应对此类事件。例如,我学到的一件事是,即使保留了 backstack,也可以杀死Application
实例和其他资源。因此,为了提供良好的用户体验,即使单个进程运行应用程序,后台堆栈也可以保留,并且所有static
Activity
static
它持有,已经消失。出于这个原因,我的应用程序现在非常坚固,可以优雅地检查状态,并在必要时重新初始化它在恢复任何Activity
.
继续我的具体问题,我看到了一个罕见的症状,通过代码检查,我相信只能由static
一个类的成员被杀死然后重新初始化,而另一个静态资源在一个我的库类尚未重新初始化。我很欣赏两个独立资源之间的这种依赖关系static
代表了我的糟糕设计,我将进行重构以避免这种情况。但是,我想知道我的分析是否可能是正确的——也就是说,是否有可能保留后台堆栈,但只有一些 static
资源被杀死,特别是在每个库/包的基础上?
编辑 1我将提供有关这两个类的更多信息。
1 类是我们将调用的类Controller
。它不用作 Singleton,但包含static
Map
在所有实例中通用的数据。它的初始化如下:
private static Map<String, String> sSomeMetaData;
static {
sSomeMetaData = new HashMap<String, String>();
}
接下来,我有一个名为MyFlyweightFactory
. 这个类存在于一个单独的库中。这个类是一个单例:
private static MyFlyweightFactory instance = new MyFlyweightFactory();
public static synchronized MyFlyweightFactory getInstance(){
return instance;
}
private MyFlyweightFactory(){ }
TreeMap<String, MyParserRenderer> images = new TreeMap<String, MyParserRenderer>();
现在,这是依赖项。工厂类有一个 getter 方法来获取某个命名的图像对象,该对象是通过从文件系统中解析文件来构造的。如果自工厂初始化以来工厂没有被要求提供该图像,它会从一个文件中解析它(它实际上是我的一个 SVG 图像解析器库)。图像被解析为MyParserRenderer
对象。当这个图像解析发生时,工厂也会在Controller
类的sSomeMetaData
成员中填充一些数据。工厂保存的所有图像都保存在您在上面看到的images
成员中。因此,这些图像是单例工厂实例TreeMap
的非静态成员。static
罕见的问题情况似乎是Controller
find的实例sSomeMetaData
是空的,即使我知道它MyFlyweightFactory
已经从它的Map
. 我相信,这肯定只会发生,如果 的实例MyFlyweightFactory
一直存在,因此不需要重新解析图像对象(这意味着它不会sSomeMetaData
再次填充),但与此同时,static
初始化器Controller
已经再次执行。我可以确认sSomeMetaData
没有在代码中的其他任何clear()
地方编辑。