Android 正在使用已完成的活动和低kb的映像退出MemoryError/InvocationTargetException?

Android 正在使用已完成的活动和低kb的映像退出MemoryError/InvocationTargetException?,android,memory,memory-leaks,android-activity,invocationtargetexception,Android,Memory,Memory Leaks,Android Activity,Invocationtargetexception,基本上我的应用程序一直崩溃。但是,我的所有活动都有“finish();”,这应该结束活动并释放记忆(至少我是这么理解的)。同样,我的图像只有几百KB,如果是的话,以PNG格式保存 我的代码至少在Java包资源管理器中没有即时错误。在DDMS中,我得到标题中列出的错误。下面的问题和答案在这里,我按照我的项目最合乎逻辑的步骤,但它没有工作。到目前为止,我已经检查了图像大小(低文件大小),并添加了finish();为了我的活动 基本上,我有大约10个活动,它崩溃了。我总共有大约60个活动,每个活动都有

基本上我的应用程序一直崩溃。但是,我的所有活动都有“finish();”,这应该结束活动并释放记忆(至少我是这么理解的)。同样,我的图像只有几百KB,如果是的话,以PNG格式保存

我的代码至少在Java包资源管理器中没有即时错误。在DDMS中,我得到标题中列出的错误。下面的问题和答案在这里,我按照我的项目最合乎逻辑的步骤,但它没有工作。到目前为止,我已经检查了图像大小(低文件大小),并添加了finish();为了我的活动

基本上,我有大约10个活动,它崩溃了。我总共有大约60个活动,每个活动都有一个图像、imagebutton和一个scrolltextview。有些人偶尔会在屏幕上出现一个图像,暂停并继续进行下一个活动。我会发布代码,但没有一页代码是直接相关的,或者至少我可以解析

至于AVD,它只是一款低SD卡内存的中端设备,然而,即使在中高端的真实设备上,该应用程序也存在同样的问题


感谢您的帮助

我经常看到这种行为,首先,让我告诉你,完成一项活动并不一定意味着操作系统会释放资源,操作系统足够聪明,可以留下一些资源,以防你决定再次打开该活动,即使你以前破坏了它,现在,当您打开更多活动时,操作系统可能会决定完全释放以前“已销毁”活动的一些资源,因为最新活动可能需要这些资源

关于内存问题,我几乎可以肯定这与图像大小调整机制有关,即使应用程序中的图像只有几KBs,如果不存储在适当的可绘制文件夹中,这些图像可能会变成几MBs,因为操作系统将使用以下公式来调整这些图像的大小,以适合您的活动:ImageWidth*ImageHeight*4Bytes,1Byte代表Alpha/R/G/B,并且在DDMS中,通过跟踪堆,您可以注意到当您进入一个活动时,堆的增长速度会非常快

为了确保问题与大小调整机制无关,请将所有可绘制文件放在一个名为:drawable nodpi的文件夹中(这样您可以告诉操作系统不要调整大小),如果您看到性能上的巨大差异,那么这意味着问题在于您的可绘制文件没有按照每个屏幕密度正确设计大小

希望这有帮助


问候

使用片段是否更适合您的案例?它们被加载和卸载为NeeDeD。如果不需要在后栈中保留某些活动,那么在启动新的意图后考虑调用FixSee()。使用Mat来确定内存泄漏的驻留位置,如果问题确实是真的泄漏。除此之外,你可能会考虑编辑你的问题来澄清你的图片来自哪里(资源?本地文件?从互联网上下载)?“我的图像只有几百KB,如果这样,保存在PNG格式。”-注意文件大小几乎不相关的内存需求。在运行时,Android会将每个图像解码成一个
位图
,通常为32位/像素(=4字节/像素)。因此,512 x 512 px映像在mdpi上需要1 MB的内存。xhdpi上的同一图像将在两个维度上按系数2缩放,因此需要4MB。简言之:像素大小将决定内存分配,而不是文件大小。为关于位到像素转换的解释干杯,它进一步加深了我对所有内容的理解!谢谢你这么详细的回答!现在有点晚了,但我明天第一件事就是开始,然后公布结果。这很有道理,非常感谢!非常感谢这篇文章!它解决了我的问题后,一些进一步的混乱。基本上,我将像素高度降低到大约500,并将它们全部保存在nodpi文件夹中,并且一切都非常快,没有任何崩溃或内存泄漏。感谢您如此快速高效地分享您的经验!呵呵,没问题,记住要始终根据android指导原则正确设计资产,这可以帮你省去很多麻烦。。。当做