1

我知道有很多关于不同情况下Android中OOM的问题和论坛,但我找不到完整的解决方案。

我有一个活动,用户可以在许多动画之间滚动。因为只有动画应该在滚动时移动,并且在开始时它必须在没有用户交互的情况下移动,所以我使用了一个 ViewFlipper,里面有动画。如下图所示: 在此处输入图像描述

问题在于,在 3.0 以上的平板电脑和设备上,它会在翻转一些动画并播放它们后抛出 OOM。为了解决问题,我到目前为止所尝试的方法是:

  1. BitmapFactory.Options我使用(我按照教程Loading Large Bitmaps Efficiently tutorial )缩小了动画图像。我在教程中唯一没有实现的是缓存。
  2. 由于动画很多,位图很多,我一次只加载了 3 个动画(当前视图,左侧一个和右侧一个),但是添加和删除位图会使应用程序的速度变慢太多。
  3. 我试图让垃圾收集器更快地释放我的图像,方法是手动调用所有可能有帮助的东西:setCallback(null), setImageDrawable(null), destroy(), destroyDrawingCache() (AdView 的最后 2 个)。我什至尝试recycle()过(对于位图),但它导致了其他异常

上述更改后有一些改进,但我仍然在模拟器 Android 4.x WVGA854 或 WVGA800 上收到 OOM(经过较长时间)。但即使它没有引发 OOM,内存分析显示 80% 的负载在一开始就有问题的设备上。此外,由于动画删除和添加,所有设备上的用户体验都很糟糕。

我开始认为更多的是架构/设计问题。可能是模拟器问题?您现在是否比 DDMS 的内存分析器更好?

我将非常感谢任何建议,我不知道还能尝试什么:)

4

1 回答 1

2

通常我用它来防止内存不足问题

bmp.recycle();
bmp = null;
System.runFinalization();
Runtime.getRuntime().gc();
System.gc();

我在使用位图后调用它

如果它仍然不起作用,也许你应该在真实设备中尝试它

于 2012-10-18T08:51:33.673 回答