2014-02-14 3 views
1

Я сделать игру, и я хотел бы, чтобы загрузить фоновые изображения canvas.ie фон должен загрузить случайным образом из массива и должен быть different.This код, который я использовалLoad Image Random в Canvas

int[] wallpaper={R.drawable.bg,R.drawable.bg_two,R.drawable.bg_three,R.drawable.bg_four, }; 

     if(globalBitmap == null){ 
     Random random = new Random(); 
     int n=random.nextInt(wallpaper.length); 
     BitmapDrawable bd = (BitmapDrawable) context.getResources().getDrawable(wallpaper[n]); 
     globalBitmap = bd.getBitmap(); 
    } 
    this.bitmap = globalBitmap; 

Но когда когда-либо загружаю игру. Только тот же фон отображается. Все 4 фона не загружаются в случайном порядке. Может ли какая-нибудь помощь решить эту проблему?

Logcat

02-14 14:38:04.757: E/AndroidRuntime(10518): FATAL EXCEPTION: main 
02-14 14:38:04.757: E/AndroidRuntime(10518): Process: com.themebowlapps.monkeyrun, PID: 10518 
02-14 14:38:04.757: E/AndroidRuntime(10518): java.lang.OutOfMemoryError 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:677) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:507) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:872) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.content.res.Resources.loadDrawable(Resources.java:3022) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.content.res.Resources.getDrawable(Resources.java:1586) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at com.themebowlapps.monkeyrun.Background.getRandom(Background.java:37) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at com.themebowlapps.monkeyrun.Background.testMethod(Background.java:43) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at com.themebowlapps.monkeyrun.Background.<init>(Background.java:30) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at com.themebowlapps.monkeyrun.Frontground.<init>(Frontground.java:19) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at com.themebowlapps.monkeyrun.GameView.<init>(GameView.java:50) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at com.themebowlapps.monkeyrun.Game.onCreate(Game.java:41) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.app.Activity.performCreate(Activity.java:5389) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2246) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2340) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.app.ActivityThread.access$800(ActivityThread.java:157) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.os.Handler.dispatchMessage(Handler.java:102) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.os.Looper.loop(Looper.java:157) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at android.app.ActivityThread.main(ActivityThread.java:5293) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at java.lang.reflect.Method.invokeNative(Native Method) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at java.lang.reflect.Method.invoke(Method.java:515) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1259) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075) 
02-14 14:38:04.757: E/AndroidRuntime(10518): at dalvik.system.NativeStart.main(Native Method) 
+1

В какой метод выше код выполняется? В какой области определяется 'globalBitmap'? –

+0

Пожалуйста, напишите более подробную информацию. –

ответ

0

Ваш globalBitmap загружать только один раз время ... Попробуйте этот код, может помочь U

int[] wallpaper={R.drawable.bg,R.drawable.bg_two,R.drawable.bg_three,R.drawable.bg_four, }; 
    BitmapDrawable getRandom() { 
     Random random = new Random(); 
     int n = random.nextInt(wallpaper.length); 
     BitmapDrawable bd = (BitmapDrawable) context.getResources().getDrawable(wallpaper[n]); 
     return bd.getBitmap(); 
    } 

    void testMethod() { 
     this.bitmap = getRandom(); 
    } 
+0

Я думаю, что ваш метод работает. Но я получаю ошибку в памяти. Поэтому я не мог убедиться, что он работает правильно. Потому что, как только приложение перестанет работать и я загружу приложение еще раз, я получаю разные background.so есть ли способ чтобы избавиться от ошибки в памяти. Сначала я использовал png-изображения, теперь jpeg все еще получаю эту ошибку. –

+0

Я думаю, что ваш образ слишком большой, попробуйте изменить размер изображения и переработайте() ваше растровое изображение до его выпуска. –

+0

Где именно я должен использовать bitmap.recycle(); ? –

0

Вы получаете OutOfMemoryError что означает окружающую среду вы работаете ваше приложение Безразлично У вас достаточно памяти для полной загрузки растрового изображения, которое вы пытаетесь загрузить.

Решение состоит в том, чтобы загрузить уменьшенную версию изображения так, чтобы она находилась в памяти. Все подробности, как это сделать, даны и объясняются here, взгляните на это и повторно используйте их метод decodeSampledBitmapFromResource() вместо того, чтобы просто позвонить Resources#getDrawable(). Обратите внимание, что вы всегда должны загружать изображения таким образом, если вы не уверены в размере исходного изображения.

Тогда есть и проблема, из-за которой вы не знаете из первых рук, сколько памяти у вас есть, так что вы не можете знать reqWidth и reqHeight, что позволит вам загружать изображение без выезда ошибки памяти. Вот почему я обычно обертываю вызов для декодирования изображения в блоке try, улавливая исключения OutOfMemoryError, и перебираю его, чтобы повторить загрузку меньшей версии изображений в случае ошибки, пока не найдет загружаемый размер. Что-то в этом аромата (оговорке: код не тестировался):

final int imageResourceId = ...; // do your random selection here 
Bitmap loadedBitmap = null; 
int reqWidth = DEFAULT_REQ_WIDTH, reqHeight = DEFAULT_REQ_HEIGHT; 
while (loadedBitmap == null && reqWidth >= MIN_REQ_WIDTH && reqHeight >= MIN_REQ_HEIGHT) { 
    try { 
     loadedBitmap = decodeSampledBitmapFromResource(getResources(), imageResourceId, reqWidth, reqHeight); 
    } catch (final OutOfMemoryError oOM) { 
     // not enough memory to load an image this size, retry with a smaller one 
     reqWidth /= 2; 
     reqHeight /= 2; 
    } 
} 
+0

Привет, так вы можете сказать мне, как изменить вышеупомянутый код? Т.е. мне нужно загружать изображения из массива в холст, и у него не должно быть ошибки памяти –

+0

Да, это то, что я только хотел сделать, отвечая на ваш вопрос. Попытайтесь прочитать его и понять, что это значит (и не забудьте сделать то же самое со связанной статьей), и вы должны увидеть, как изменить данный код. Я рад еще раз объяснить что-то непонятное или что вы не понимаете, но я не могу написать ваш код для вас; это только «объясните мне» сайт Q & A, а не «сделать это для меня» сайт для отправки фрилансера :) – desseim