Java 当静态资源被杀死时,它们是全部被杀死了,还是在罕见的边缘情况下可以保留一些?
注意:虽然到目前为止(9月6日)提供的两个答案很有趣,但不幸的是,它们没有解决这个问题 我的一个Android测试设备是HTC One X。该设备以频繁杀戮后台应用程序(最令人恼火的是,甚至包括launcher)而闻名,因为它在RAM分配方面往往处于边缘,可能是由于HTC bloatware。然而,就我而言,这非常有用,因为它有助于突出各种低内存情况的影响,并允许我改进应用程序以应对此类事件。例如,我学到的一件事是,即使保留了Java 当静态资源被杀死时,它们是全部被杀死了,还是在罕见的边缘情况下可以保留一些?,java,android,Java,Android,注意:虽然到目前为止(9月6日)提供的两个答案很有趣,但不幸的是,它们没有解决这个问题 我的一个Android测试设备是HTC One X。该设备以频繁杀戮后台应用程序(最令人恼火的是,甚至包括launcher)而闻名,因为它在RAM分配方面往往处于边缘,可能是由于HTC bloatware。然而,就我而言,这非常有用,因为它有助于突出各种低内存情况的影响,并允许我改进应用程序以应对此类事件。例如,我学到的一件事是,即使保留了活动backbackback,也可以杀死应用程序实例和其他静态资源。因
活动
backbackback,也可以杀死应用程序
实例和其他静态
资源。因此,为了提供良好的用户体验,即使运行应用程序的单个进程以及它所持有的所有静态
s都消失了,backbackback仍然可以保持。由于这个原因,我的应用程序现在非常健壮,可以优雅地检查状态,并在必要时对恢复任何活动时所需的“单例”数据进行重新初始化
转到我的具体问题,我看到了一个罕见的症状,通过代码检查,我认为这可能是由一个类的静态成员被杀死,然后重新初始化,而我的库类中的另一个静态资源没有重新初始化引起的。我理解两个独立的静态资源之间的这种依赖性代表了我的糟糕设计,我将进行重构以避免这种情况。然而,我想知道我的分析是否可能是正确的——也就是说,是否有可能存在这样一种情况,即在这种情况下,保留了backbackback,但只删除了一些静态资源,特别是在每个库/包的基础上
编辑1我将提供有关这两个类的更多信息
类1是一个我们称之为Controller
的类。它不作为单例使用,但包含所有实例中通用的静态
映射
。它的首字母是这样写的:
private static Map<String, String> sSomeMetaData;
static {
sSomeMetaData = new HashMap<String, String>();
}
现在,这里是依赖关系。工厂类有一个getter方法来获取某个命名的图像对象,该对象是通过解析文件系统中的文件构建的。如果自工厂初始化以来没有要求工厂提供该图像,它将从文件中解析该图像(实际上是我的SVG图像解析器库)。图像被解析为MyParserRender
对象。发生此图像解析时,工厂还将填充控制器
类'sSomeMetaData
成员中的一些数据。工厂保存的所有图像都保存在上面看到的images
成员TreeMap
中。因此,这些图像是静态
单例工厂实例的非静态成员
罕见的问题情况似乎是,Controller
的实例发现ssomeetadata
为空,尽管我知道MyFlyweightFactory
从其映射中提供了一些对象。我相信,如果MyFlyweightFactory
的存在一直存在,因此不需要重新解析图像对象(这意味着它将不再填充sSomeMetaData
),这种情况肯定会发生,但与此同时,Controller
的static
初始值设定项再次执行。我可以确认sSomeMetaData
未在代码中的任何其他位置clear()
ed 你应该看看这个:
内存不足时,暂停的活动将被终止以释放内存
因此,为什么您应该尝试在您必须重新创建活动的每种情况下解释这一点
这不是一个完整的应用程序,而是基于活动的。因此,它将开始扼杀它认为不那么重要的活动。在同一个应用程序中,某些活动可能会受到影响,其他活动则不会受到影响
注意上表中的“Killable”列——对于那些标记为Killable的方法,在该方法返回承载活动的进程后,系统可能随时终止该进程,而不执行其另一行代码。因此,应该使用onPause()方法将任何持久数据(如用户编辑)写入存储。此外,在将活动置于此类后台状态之前,会调用onSaveInstanceState(Bundle)方法,允许您将活动中的任何动态实例状态保存到给定的Bundle中,以便在需要重新创建活动时在onCreate(Bundle)中接收。有关流程的生命周期如何与其承载的活动关联的更多信息,请参见流程生命周期部分。请注意,在onPause()而不是onSaveInstanceState(Bundle)中保存持久性数据非常重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的每种情况下调用
我认为您在调试或跟踪应用程序中的问题时不知何故走错了方向
以下是我能告诉你的,我认为你理解错了:
当您的应用程序因需要资源而被Android销毁时,您的应用程序
类也将被“销毁/停止”,而backstack
将被保留。当您重新启动应用程序时,特定的应用程序
类将被“重新创建”(onCreate()
将被调用),您的活动
后台堆栈也将被重新创建,这意味着用户可以看到的最后一个活动
将被重新创建
private static MyFlyweightFactory instance = new MyFlyweightFactory();
public static synchronized MyFlyweightFactory getInstance(){
return instance;
}
private MyFlyweightFactory(){ }
TreeMap<String, MyParserRenderer> images = new TreeMap<String, MyParserRenderer>();