【问题标题】:Android app crashes when loading new activity - failed to allocate memory加载新活动时 Android 应用程序崩溃 - 无法分配内存
【发布时间】:2015-10-16 06:09:31
【问题描述】:

我的安卓应用在我的平板电脑上运行良好,但是当你在我的手机上加载活动时它会崩溃。

我觉得奇怪的是,当您启动应用程序时,主标题页加载没有问题,但是当我加载游戏活动或仅加载说明页面活动时,应用程序将崩溃。

标题页由一个背景图像和 3 个图像按钮组成,而说明页面由一个相同分辨率的背景图像和标题页活动的 3 个相同按钮中的 2 个组成。所以它有效地加载了更少的图像是我所得到的,但是在尝试加载该活动时它会崩溃。

这是堆栈跟踪:

07-25 12:51:14.841  16090-16090/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: bitrump.fishygame, PID: 16090
java.lang.OutOfMemoryError: Failed to allocate a 132710412 byte allocation with 16777120 free bytes and 72MB until OOM
        at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
        at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:816)
        at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:637)
        at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:665)
        at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:695)
        at bitrump.fishygame.gameGraphics.onCreate(gameGraphics.java:41)
        at android.app.Activity.performCreate(Activity.java:6374)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2767)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2879)
        at android.app.ActivityThread.access$900(ActivityThread.java:182)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1475)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:6141)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

有没有人知道如何提高应用程序的效率?它正在一款最新的手机 Galaxy s6 上崩溃。顺便说一下,它使用的平板电脑是 nvidia shield 平板电脑。

【问题讨论】:

  • 您创建的位图大小是多少?从消息看起来大约 126 MB?对吗?
  • 最大的是我的背景图片,大小为 252kb。
  • 谢谢,这似乎是由于我的背景图片。每当我完全从这两个活动中取出背景图像时,它们都会起作用。我需要寻找一种更好的方法来获得我想要的背景图片。

标签: android


【解决方案1】:

这是由于你的背景图片,你需要做的只是得到一个由设计师(做你自己)完成的尺寸更小,像素质量更高的图像。

在stackoverflow上搜索相同的问题很多次都准备好了:

xxxhdpi:1280x1920 像素
xxhdpi:960x1600 像素
xhdpi:640x960 像素
hdpi:480x800 像素
mdpi:320x480 像素
ldpi:240x320 像素

Please Go With Developer Docs

【讨论】:

    【解决方案2】:

    注意几点:

    如果这是一个静态横幅图片,您应该只使用 Android 默认提供的“大小”存储桶,并让 Android ImageView 负责正确缩放、加载和卸载。

    http://developer.android.com/guide/practices/screens_support.html

    如果您需要这张图片来“闲逛”,请记住大图片会占用大量内存。下采样是你的朋友。如果需要,可以在将图像加载到内存时使用 inSampleSize 执行此操作,但粒度不是很大。它适用于二的幂。 IE。您可以每次将图像大小减小一半。这通常不是大多数应用程序的选择,因为您会损失太多图像质量。

    http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize

    如果您必须扩展它,请遵循这些准则,我个人会避免这样做。

    http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

    现在这不是一个“解决方案”,但如果您的应用程序很饿,添加一个大堆标志可能会有所帮助。对于 QA 和开发,请忽略这一点。如果您依赖它,那么您可能做错了。

    http://developer.android.com/reference/android/R.styleable.html#AndroidManifestApplication_largeHeap

    我必须查看更多代码才能给出更好的答案。

    【讨论】:

      猜你喜欢
      • 2015-08-08
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 2021-09-04
      • 1970-01-01
      相关资源
      最近更新 更多