【问题标题】:OutOfMemory for Animation in ViewFlipperViewFlipper 中动画的 OutOfMemory
【发布时间】:2012-10-18 08:36:39
【问题描述】:

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

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

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

  1. 我使用BitmapFactory.Options(我 按照教程Loading Large Bitmaps Efficiently tutorial)。我在教程中唯一没有实现的是缓存。
  2. 既然有很多动画,那么多位图,我 一次只加载 3 个动画(当前视图, 左边和右边那个),但是添加和删除位图有 应用太慢了。
  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


【解决方案1】:

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

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

我在使用位图后调用它

如果还是不行,你应该在真机上试试

【讨论】:

  • 谢谢,我尝试了 bmp.recycle,但我并没有真正提供帮助(您是否还需要在同一个活动中加载许多位图?)。关于 System.gc() 我读到不能调用它,因为有一个复杂的回收算法,并且通过手动调用 GC 算法变得无用,所以我避免了。
  • hmmmm,是的,我需要在同一个活动中加载许多位图,system.gc() 解决了它,但如果你不想使用它,也许其他一些解决方案,比如使用片段?你试过了吗?
  • Framents 似乎是个好主意,我会试试的。非常感谢 NAYOSO:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多