Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ViewFlipper中动画的OutOfMemory_Java_Android_Android Layout_Memory_Memory Management - Fatal编程技术网

Java ViewFlipper中动画的OutOfMemory

Java ViewFlipper中动画的OutOfMemory,java,android,android-layout,memory,memory-management,Java,Android,Android Layout,Memory,Memory Management,我知道在不同的情况下,有很多关于Android中OOM的问题和论坛,但我找不到一个完整的解决方案 我有一个活动,用户可以在多个动画之间滚动。因为只有动画应该在滚动时移动,并且在开始时它必须在没有用户交互的情况下移动,所以我使用了一个带有动画的ViewFlipper。如下图示意图所示: 问题是,在3.0以上的平板电脑和设备上,它在翻转一些动画并播放它们之后会抛出OOM。为了解决这个问题,我一直在尝试: 我使用BitmapFactory.Options缩小了动画图像的比例 遵循教程)。我在教程中唯

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

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

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

  • 我使用BitmapFactory.Options缩小了动画图像的比例 遵循教程)。我在教程中唯一没有实现的是缓存
  • 因为有很多动画,很多位图,我 一次仅加载3个动画(当前视图,位于 左侧和右侧),但添加和删除位图会 应用程序速度过慢
  • 我试图让垃圾收集器更快地释放我的图像,方法是手动调用一切可能有帮助的东西:
    setCallback(null)
    setImageDrawable(null)
    destroy()
    destrowingDrawingCache()
    (最后两个用于AdView)。我甚至尝试了
    recycle()
    (对于位图),但它导致了其他异常
  • 在上面的更改之后,有了一些改进,但我仍然在仿真器Android 4.x WVGA854或WVGA800上接收OOM(经过一段较长的时间)。但是,即使它没有发出OOM,内存分析也显示80%的加载在一开始就有问题的设备上。此外,由于删除和添加动画,所有设备上的用户体验都不好

    我开始认为这更像是一个架构/设计问题这可能是模拟器问题?您现在的内存分析器是否比DDMS透视图中的更好?


    如果有任何建议,我将不胜感激,我不知道还有什么可以尝试:)

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

    bmp.recycle();
    bmp = null;
    System.runFinalization();
    Runtime.getRuntime().gc();
    System.gc();
    
    我在使用位图后调用它


    如果它仍然不起作用,也许你应该在真正的设备上试用它

    你试过使用system.gc()吗?谢谢!正如我在下面所说的,我们似乎应该尽量避免这一呼吁,正如这个问题所显示的那样。但是我会试试看区别。谢谢,我试过bmp.recycle,但我没有真正的帮助(你也需要在同一个活动中加载许多位图吗?)。关于System.gc(),我读到调用它是不合适的,因为有一个复杂的循环算法,通过手动调用gc,该算法变得无用,所以我避免了。嗯,是的,我需要在同一个活动中加载多个位图,System.gc()解决了这个问题,但是如果你不想使用它,也许是其他的解决方案,比如使用片段?你试过了吗?框架似乎是个很好的主意,我会试试。非常感谢你,纳约佐:)