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

当内存不足时,暂停的活动将被终止以释放内存。
因此,为什么您应该在必须重新创建活动的每种情况下尝试并解释这一点。
这不是一个完整的应用程序,而是基于活动的应用程序。因此它会开始杀死它认为不那么重要的活动。在同一应用程序中,某些活动可能会受到影响,而另一些则不会。
请注意上表中的“可杀死”列 - 对于那些标记为可杀死的方法,在该方法返回后,托管活动的进程可能会随时被系统杀死,而无需执行其另一行代码。因此,您应该使用 onPause() 方法将任何持久数据(例如用户编辑)写入存储。此外,方法 onSaveInstanceState(Bundle) 在将 Activity 置于此类后台状态之前被调用,允许您将 Activity 中的任何动态实例状态保存到给定的 Bundle 中,如果 Activity 稍后会在 onCreate(Bundle) 中接收到需要重新创建。有关流程的生命周期如何与其托管的活动相关联的更多信息,请参阅流程生命周期部分。请注意,在 onPause() 而不是 onSaveInstanceState(Bundle) 中保存持久数据非常重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的每种情况下都被调用。
| 归档时间: |
|
| 查看次数: |
196 次 |
| 最近记录: |