- Forum-Beiträge: 609
28.12.2018, 21:34:45 via Website
28.12.2018 21:34:45 via Website
Hallo zusammen
Ich erstelle ein Spiel worin man Bilder anklicken muss und dann verschwinden sie wieder. Diese Bilder erstelle ich mit "ImageView". Wenn ich das Spiel spiele, dann erscheint nach einem Moment ein "OutOfMemory". Nun frage ich mich ob ich die Views falsch anlege oder nicht korrekt entferne. Oder gibt es eine Möglichkeit um den Speicher auf zu räumen?
Nun die Angaben zu meinem Programm:
Die Fehlermeldung:
12-28 20:58:07.549 29054-29054/ch.robbisoft.mueckenfang E/Mückenfangen: Bild laden Posotion : -1 / 1
12-28 20:58:07.559 307-29494/? E/AudioSink: received unknown event type: 1 inside CallbackWrapper !
12-28 20:58:07.669 29054-29054/ch.robbisoft.mueckenfang E/art: Throwing OutOfMemoryError "Failed to allocate a 31674396 byte allocation with 16777120 free bytes and 27MB until OOM"
12-28 20:58:07.679 29054-29054/ch.robbisoft.mueckenfang E/AndroidRuntime: FATAL EXCEPTION: main
Process: ch.robbisoft.mueckenfang, PID: 29054
java.lang.OutOfMemoryError: Failed to allocate a 31674396 byte allocation with 16777120 free bytes and 27MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:745)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:566)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1014)
at android.content.res.Resources.loadDrawableForCookie(Resources.java:3730)
at android.content.res.Resources.loadDrawable(Resources.java:3603)
at android.content.res.Resources.getDrawable(Resources.java:1852)
at android.content.Context.getDrawable(Context.java:410)
at android.widget.ImageView.resolveUri(ImageView.java:752)
at android.widget.ImageView.setImageResource(ImageView.java:408)
at ch.robbisoft.mueckenfang.GameActivity.setzeBild(GameActivity.java:190)
at ch.robbisoft.mueckenfang.GameActivity.eineMueckeAnzeigen(GameActivity.java:168)
at ch.robbisoft.mueckenfang.GameActivity.zeitHerunterzaehlen(GameActivity.java:133)
at ch.robbisoft.mueckenfang.GameActivity.run(GameActivity.java:251)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5938)
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:1400)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
12-28 20:58:07.709 838-29962/? E/android.os.Debug: ro.product_ship = true
12-28 20:58:07.709 838-29962/? E/android.os.Debug: ro.debug_level = 0x4f4c
12-28 20:58:07.869 7663-29973/? E/SQLiteLog: (284) automatic index on crash_info_summary(package_name_touched)
12-28 20:58:07.919 5787-5787/? E/SecureStorage: [ERROR]:SPID(0x00000000)Data block not found: -1
12-28 20:58:08.259 5787-5787/? E/SecureStorage: [ERROR]:SPID(0x00000000)Error processing data
12-28 20:58:08.259 5787-5787/? E/SecureStorage: [ERROR]:SPID(0x00000000)Android: read data error: -1
12-28 20:58:08.849 300-300/? E/SMD: DCD OFF
Der Code:
private void setzeBild(ImageView biene, int vx, int vy) {
Log.e("Mückenfangen","Bild laden Posotion : " + vx + " / " + vy);
biene.setImageResource(MUECKEN_BILDER[vy+1][vx+1]);
}
private void eineMueckeAnzeigen(){
int breite = spielbereich.getWidth();
int hoehe = spielbereich.getHeight();
int muecke_breite = Math.round(massstab * 42);
int muecke_hoehe = Math.round(massstab * 50);
int links = zufallsgenerator.nextInt(breite - muecke_breite);
int oben = zufallsgenerator.nextInt(hoehe - muecke_hoehe);
ImageView muecke = new ImageView(this);
// muecke.setImageResource(R.drawable.biene);
muecke.setOnClickListener(this);
int vx;
int vy;
double faktor = 1.0;
//Falls die Geschwindikeit 0 ist
do{
vx = zufallsgenerator.nextInt(3) - 1;
vy = zufallsgenerator.nextInt(3) - 1;
}while(vx==0 && vy==0);
setzeBild(muecke, vx, vy);
if(vx != 0 && vy != 0){
faktor = 0.70710678;
}
vx = (int) Math.round(massstab * vx * faktor);
vy = (int) Math.round(massstab * vy * faktor);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(muecke_breite, muecke_hoehe);
params.leftMargin = links;
params.topMargin = oben;
params.gravity = Gravity.TOP + Gravity.LEFT;//links oben 51
spielbereich.addView(muecke, params);
muecke.setTag(R.id.geburtsdarum, new Date());
muecke.setTag(R.id.vx, new Integer(vx));
muecke.setTag(R.id.vy, new Integer(vy));
mp.seekTo(0);
mp.start();
}
Was kann ich machen, dass das Programm nicht mehr abstürzt?
Gruss Renato
— geändert am 28.12.2018, 22:00:42 durch Moderator
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.