【发布时间】:2012-10-18 08:36:39
【问题描述】:
我知道有很多关于不同情况下Android中OOM的问题,论坛,但我找不到完整的解决方案。
我有一个活动,用户可以在多个动画之间滚动。因为只有动画应该在滚动时移动,并且在开始时它必须在没有用户交互的情况下移动,所以我使用了一个 ViewFlipper,里面有动画。如下图所示:
问题在于,在 3.0 以上的平板电脑和设备上,它会在翻转一些动画并播放它们后抛出 OOM。为了解决问题,我到现在为止的尝试:
- 我使用
BitmapFactory.Options(我 按照教程Loading Large Bitmaps Efficiently tutorial)。我在教程中唯一没有实现的是缓存。 - 既然有很多动画,那么多位图,我 一次只加载 3 个动画(当前视图, 左边和右边那个),但是添加和删除位图有 应用太慢了。
- 我试图让垃圾收集器更快地释放我的图像,方法是手动调用所有可能有帮助的东西:
setCallback(null)、setImageDrawable(null)、destroy()、destroyDrawingCache()(AdView 的最后两个)。我什至尝试过recycle()(用于位图),但它导致了其他异常
经过上述更改后,有一些改进,但我仍然在模拟器 Android 4.x WVGA854 或 WVGA800 上收到 OOM(经过较长时间后)。但即使它没有引发 OOM,内存分析显示 80% 的负载在一开始就有问题的设备上。此外,由于动画移除和添加,所有设备上的用户体验都很差。
我开始认为更多的是架构/设计问题。 可能是模拟器问题?您现在是否比 DDMS 方面的内存分析器更好?
如果有任何建议,我将不胜感激,我不知道还能尝试什么:)
【问题讨论】:
-
你试过使用system.gc()吗?
-
谢谢!正如我在下面所说的,我们似乎应该尽量避免这个问题(stackoverflow.com/questions/3117429/…)显示的那个电话。但我会尝试看看有什么不同。
标签: java android android-layout memory memory-management