加载新活动时Android应用程序崩溃 - 无法分配内存

时间:2015-07-25 18:18:37

标签: android

我的Android应用程序在我的平板电脑上工作正常,但是当你在我的手机上加载活动时它会崩溃。

对我来说似乎很奇怪的是主要标题页在启动应用程序时加载没有问题,但是当我加载游戏活动或只是指示页面活动时,应用程序将崩溃。

标题页包含背景图像和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)

有没有人有关于如何提高应用效率的任何信息?它正在崩溃的最新手机之一,一个星系s6。顺便说一下,它的平板电脑是一款nvidia盾牌。

2 个答案:

答案 0 :(得分:0)

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

搜索stackoverflow相同的qustion已经多次准备好了问:

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

Please Go With Developer Docs

答案 1 :(得分:0)

有几点需要注意:

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

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

如果您需要此图像“闲逛”,请记住大图像占用大量内存。下采样是你的朋友。如果你想使用inSampleSize,你可以在将图像加载到内存时这样做,但粒度不是那么大。它适用于两个权力。 I.E.你可以每次减少一半的图像大小。对于大多数应用程序而言,这通常不是一个选项,因为您丢失了太多的图像质量。

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

如果你必须按照这些指南进行扩展,我个人会避免这种情况。

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

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

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

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