java.lang.OutOfMemoryError:无法分配带有16777216个空闲字节的756946956字节分配和433MB直到OOM

时间:2016-12-21 13:42:36

标签: android android-bitmap

我想在每次启动该活动时更改Activity的布局的背景图像。出于这个原因,在onResume()内,我随机设置了布局的背景图像:

@Override
public void onResume(){
    super.onResume();
    Random r = new Random();
    int randNumber = r.nextInt(homeBackgroundImage.length);
    mBackgroundLayout.setBackground(ResourcesCompat.getDrawable(getResources(), homeBackgroundImage[randNumber], null));
}

但是,我在以下行中得到例外:

mBackgroundLayout.setBackground(ResourcesCompat.getDrawable(getResources(), homeBackgroundImage[randNumber], null));

这是logcat输出:

java.lang.OutOfMemoryError: Failed to allocate a 756946956 byte allocation with 16777216 free bytes and 433MB until OOM
                                                                        at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                                                                        at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                                                                        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
                                                                        at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
                                                                        at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080)
                                                                        at android.content.res.Resources.loadDrawableForCookie(Resources.java:2635)
                                                                        at android.content.res.Resources.loadDrawable(Resources.java:2540)
                                                                        at android.content.res.Resources.getDrawable(Resources.java:806)
                                                                        at android.support.v4.content.res.ResourcesCompatApi21.getDrawable(ResourcesCompatApi21.java:27)
                                                                        at android.support.v4.content.res.ResourcesCompat.getDrawable(ResourcesCompat.java:60)
                                                                        at in.avara.app.avaravrplayer.Activity.MainActivity.onResume(MainActivity.java:167)
                                                                        at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1258)
                                                                        at android.app.Activity.performResume(Activity.java:6327)
                                                                        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)
                                                                        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
                                                                        at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                        at android.os.Looper.loop(Looper.java:148)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

有人,请建议我在每次发布时随机更改布局背景图片的优化和最佳方法是什么。

注意:我已尝试添加android:hardwareAccelerated="false"android:largeHeap="true"。但是,它在我的情况下不起作用。

提前致谢!

2 个答案:

答案 0 :(得分:1)

尝试将图像从res / drawable /移动到res / drawable / drawable-nodpi。如果问题仍然存在,请在应用程序中的清单中输入android:largeHeap =“true”。

答案 1 :(得分:0)

您正在尝试分配756946956个字节〜= 721MB。这太大

此外,756946956字节表示相当于13756 x 13756像素图像。这远远超过任何Android屏幕。

您需要识别失败的图像并显着降低其分辨率。

如果您将此图片放在res/drawable/中,请注意res/drawable/res/drawable-mdpi/的同义词。当您在更高的屏幕密度(例如xhdpi)上使用该绘图时,您的图像将被上采样。您可能应该将该drawable从res/drawable/移出到特定于密度的目录中以获得所需的密度(例如res/drawable-xhdpi/),或移动到res/drawable-nodpi/以禁用此基于密度的重新采样。