OutOfMemory beim Starten einer neuen Activity

  • 1 Antworten
  • Letztes Antwortdatum
Kardroid

Kardroid

Stamm-User
154
Hallo,

ich sitze jetzt schon ein paar Stunden an meinem Problem und habe keine Idee mehr wie ich noch googlen soll.

Ich habe eine Bewegungserkennung, die die Bewegung von einer vorher definierten Farbe anhand von OpenGL in einer SurfaceView bestimmt.

Der speicherlastige Code sieht in etwa so aus:
Code:
@Override
    public void onPreviewFrame(byte[] arg0, Camera arg1) {

            previewSize = arg1.getParameters().getPreviewSize();

            mWidth = previewSize.width;
            mHeight = previewSize.height;

            //Hier wird aus dem aktuellen CameraFrame ein int-Array, damit ich es in ein Bitmap konvertieren kann.
            int[] imagePixels = convert(arg0, previewSize.width, previewSize.height);
            //Hier erstelle ich ein Bitmap
            bitmapImage = Bitmap.createBitmap(imagePixels, previewSize.width, previewSize.height, Bitmap.Config.ARGB_8888);

            //Hier wird ein GLFilter auf das Bild gesetzt, um die Farbe zu erkennen
            mGLImage.setImage(bitmapImage);
            bitmapImage = mGLImage.getBitmap();

                //Hier wird aus dem neuen Bild mit dem Filter wieder ein int-Array, damit ich dieses analysieren kann.
                pix = new int[mWidth * mHeight];
                bitmapImage.getPixels(pix, 0, mWidth, 0, 0, mWidth, mHeight);

                //Hiermit versuche ich das Objekt über den GC zu löschen
                bitmapImage = null;

                //Hier wird jeder Pixel des Bildes analyisiert, ob er schwarz ist. Die Koordinaten werden gespeichert um die weitere Erkennung durchzuführen.
                //Only the clear part in the middle will be analyzed.
                double top = PlayOverlayView.PLAY_AREA_TOP;
                double bot = PlayOverlayView.PLAY_AREA_BOTTOM;
                double left = PlayOverlayView.PLAY_AREA_LEFT;
                double right = PlayOverlayView.PLAY_AREA_RIGHT;

                int rowLineSum = 0, detectedRowLinesCount = 0;
                for(int y = (int)(top*mHeight); y <= (int)(bot*mHeight); ++y)
                {
                    int maxPixelsInRow = 0;

                    for(int x = (int)(left*mWidth); x <= (int)(right*mWidth); ++x)
                    {
                        if (pix != null) {
                            //offset locates the pixel in the data from x,y.
                            //4 for 4 bytes of data per pixel, w is width of one row of data.
                            int index = y * mWidth + x;
                            //int alpha =  data[offset];
                            int bActual = pix[index]&0xFF;
                            int gActual = (pix[index]>>8)&0xFF;
                            int rActual = (pix[index]>>16)&0xFF;
                            int aActual = (pix[index]>>24)&0xFF;

                            if(bActual > 0 || gActual > 0 || rActual > 0)
                            {
                                xCoords.add(x);
                                yCoords.add(y);
                                maxPixelsInRow++;
                            }

                        }

                    }
D.h.: Ich allokiere zweimal wegen den Bitmaps "viel" Speicher.

Aber an dieser Stelle bekomme ich gar kein OutOfMemory-Problem.
Sondern, wenn ich die Activity wechsel, gibt es folgenden OutOfMemoryError:

Code:
02-24 15:42:06.819: E/AndroidRuntime(32474): Caused by: java.lang.OutOfMemoryError
02-24 15:42:06.819: E/AndroidRuntime(32474):     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
02-24 15:42:06.819: E/AndroidRuntime(32474):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
02-24 15:42:06.819: E/AndroidRuntime(32474):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
02-24 15:42:06.819: E/AndroidRuntime(32474):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:832)
02-24 15:42:06.819: E/AndroidRuntime(32474):     at android.content.res.Resources.loadDrawable(Resources.java:2988)
02-24 15:42:06.819: E/AndroidRuntime(32474):     at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
02-24 15:42:06.819: E/AndroidRuntime(32474):     at android.view.View.<init>(View.java:3563)
02-24 15:42:06.819: E/AndroidRuntime(32474):     at android.view.View.<init>(View.java:3492)
Ich starte die weitere Activity über folgenden Code:
Code:
Intent intent = new Intent(myActivity, GameFinishActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
this.finish();
Über das Flag und den finish()-Befehl versuche ich die alte Activity aus dem Speicher zu löschen.

Jetzt sind also meine Fragen:
1. Frisst meine App einfach per Konzept zu viel Speicher?
2. Kann ich die Analyse jedes Frames meiner Kamera schlanker machen?
3. Oder wie kann ich den Speicher vor dem Wechsel der Activities aufräumen?
 
Ich habe das Problem gelöst.

Beim Umwandeln des Bildes wurde eine Liste gefüllt, die nicht wieder geleert wurde.
 

Ähnliche Themen

D
Antworten
5
Aufrufe
573
swa00
swa00
S
Antworten
7
Aufrufe
1.200
Silvasurf
S
Zurück
Oben Unten