2016-12-21 1 views
1

Я хочу изменить фоновое изображение макета моей деятельности каждый раз, когда я запускаю это действие. По этой причине, в onResume(), я случайно установив фоновое изображение макета, как это:java.lang.OutOfMemoryError: Не удалось выделить выделение байтов 756946956 с 16777216 бесплатными байтами и 433 МБ, пока OOM

@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". Но в моем случае это не сработало.

Заранее благодарен!

+0

Какое ваше изображение? Вы создали изображение для каждого разрешения устройства? – fbwnd

+0

Вы пытаетесь выделить 756 МБ в памяти :) – hasan83

ответ

0

Вы пытаетесь выделить 756946956 байт ~ = 721 МБ. Это слишком большой.

Кроме того, 756946956 байтов представляет собой эквивалент изображения размером 13756 x 13756 пикселей. Это намного больше, чем любой экран Android.

Вам необходимо идентифицировать изображение, которое не работает и значительно уменьшает его разрешение.

Если вы положите это изображение в res/drawable/, имейте в виду, что res/drawable/ является синонимом res/drawable-mdpi/. Ваше изображение будет повышаться, если вы используете его для увеличения при более высоких плотностях экрана (например, xhdpi). Вероятно, вы должны перенести этот вывод из res/drawable/ и в каталог плотности для нужной плотности (например, res/drawable-xhdpi/) или в res/drawable-nodpi/, чтобы отключить эту повторную выборку на основе плотности.

1

Постарайтесь перенести изображения с разрешением res/drawable/to res/drawable/drawable-nodpi. Если проблема все еще здесь, в вашем манифесте под приложением ставится андроид: largeHeap = "true".

+0

Переход на папку drawable-nodpi работал для меня –

Смежные вопросы

 Смежные вопросы