【问题标题】:java.lang.OutOfMemoryError in Ice Cream Sandwich冰淇淋三明治中的 java.lang.OutOfMemoryError
【发布时间】:2013-09-23 03:28:23
【问题描述】:

我一直在网上搜索这个。我似乎找不到正确的做法。

我们使用“Beginning Android Games”一书制作了一款 2d 滚动 Android 游戏。到目前为止,一切都很顺利,但是当我们添加大量位图时,游戏在所有设备上都崩溃了。所以我们删除了位图,它可以在姜饼、蜂窝和软糖设备上运行。但它在 ICE CREAM SANDWICH 设备中并没有真正起作用,我感到很沮丧。

希望你能帮助我。

这是 logcat 错误:

09-23 11:22:54.866: E/AndroidRuntime(3525): java.lang.OutOfMemoryError
09-23 11:22:54.866: E/AndroidRuntime(3525): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
09-23 11:22:54.866: E/AndroidRuntime(3525): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:483)
09-23 11:22:54.866: E/AndroidRuntime(3525): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:549)
09-23 11:22:54.866: E/AndroidRuntime(3525): at framework.implementation.AndroidGraphics.newPixmap(AndroidGraphics.java:49)
09-23 11:22:54.866: E/AndroidRuntime(3525): at game.LoadingScreen.update(LoadingScreen.java:27)
09-23 11:22:54.866: E/AndroidRuntime(3525): at framework.implementation.AndroidFastRenderView.run(AndroidFastRenderView.java:48)
09-23 11:22:54.836: E/dalvikvm-heap(3525): Out of memory on a 3840016-byte allocation.

增长堆增加到 33.98MB

【问题讨论】:

  • 从 LoadingScreen 上传您的更新
  • 曾经我也遇到过这种错误,在我的情况下,问题是没有为指定的屏幕密度添加图片,系统将默认图像缩放到所需的密度并由于大图像而崩溃,尝试添加正确的缩放图像,看看是否有帮助..
  • @JRowan LoadingScreen 类的更新方法接收浮点 deltaTime 和如下位图: Assets.buttons = g.newPixmap("buttons.png", PixmapFormat.ARGB4444);然后它会转移到 game.setScreen(new MainMenuScreen(game));
  • @Eugen Halca 添加正确的缩放图像是什么意思?你能详细说明一下吗?
  • 尝试在更新方法之外加载你的资产,就像在构造函数中一样,也许它每次更新运行时都会加载,它是通过 deltaTime 或帧率或其他任何东西及其重载,我的意思是更新方法通常运行像每秒 100 次可能每次调用 g.newPixmap() 时它都会为位图分配内存

标签: java android bitmap


【解决方案1】:

1.实际上,您大部分时间都在使用图像。在 andorid 中,图像是由 Bitmap 处理的,因此这些位图会消耗更多的“堆内存”,因为每次更改图像时都会创建更多的位图对象。所以我们必须使用“对象池方法”来避免 java.lang.OutOfMemoryError 异常。

这里是链接,如何创建对象池。

链接:http://www.devahead.com/blog/2011/12/recycling-objects-in-android-with-an-object-pool-to-avoid-garbage-collection/

2.在4.X安卓版设备中,设置中可以看到“开发者设置”。在开发者设置中,您必须启用“不保留活动”,它会尽快销毁后台的所有活动。

在这种情况下,您的应用 Activity 不应崩溃,如果它崩溃,您的 Activity 不会遵循 Android Activity 生命周期。

这里是链接供您参考:http://developer.android.com/training/basics/activity-lifecycle/index.html

【讨论】:

  • 嗨@Androiddevandtester!你说的Object Pooling Method和这个Pool类一样吗? kilobolt.com/day-5-the-android-game-framework-part-i.html - #10
  • @user2805659 没错。
  • @Androiddevandtester 我已经有了那个名为 Pool.java 的类。而且它似乎不起作用......
  • @user2805659 那你就得用Eclipse MAT分析这些问题了。
【解决方案2】:

尝试在更新方法之外加载您的资产,例如在构造函数中,也许它会在每次更新运行时加载,通过 deltaTime 或帧速率或其他任何方式及其重载,我的意思是更新方法通常每秒运行 100 次每次调用 g.newPixmap() 时,它都会为位图分配内存

【讨论】:

    【解决方案3】:

    重新使用 BitmapFactory 实例,不要为您使用的每个图像创建一个新实例。

    在调用带有 InputStream 参数的 decodeStream 之后,你应该释放这个类的具体实现中的所有资源。直接在 InputStream 上调用 close 什么都不做。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 2012-05-02
    • 1970-01-01
    • 2014-03-26
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    相关资源
    最近更新 更多