1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

OutOfMemoryError

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Bobert, 06.01.2012.

  1. Bobert, 06.01.2012 #1
    Bobert

    Bobert Threadstarter Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    Hallo,

    ich habe das Problem, dass ich irgendwann die folgende Fehlermeldung bekomme:"java.lang.OutOfMemoryError: bitmap size exceeds VM budget"

    Der Fehler tritt nach einer gewissen Zeit auf, wenn ich von der einen Seite auf die andere Seite wechsele, und je nach Größe der Bilder früher oder später (z.B. 100kb Bilder 30-40 wechseln).

    Folgendes hat mir leider nicht weiter geholfen!
    android - java.lang.OutOfMemoryError: bitmap size exceeds VM budget - Stack Overflow
    image - Android: Strange out of memory issue - Stack Overflow

    Kennt einer von euch einen Workaround oder was habe ich übersehen!?

    Danke Bobert

    Code:
    package your.namespace;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.os.Environment;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ImageView;
    
    public class LoadFromSDActivity extends Activity implements OnClickListener {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
           
            ((ImageView)findViewById(R.id.imageView1)).setImageBitmap(BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/IMG1.png"));        
            findViewById(R.id.imageView1).setOnClickListener(this);        
        }
    
        @Override
        public void onClick(View v) {
            startActivity(new Intent(this, LoadImages.class));        
        }
    }
    
    Code:
    package your.namespace;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.os.Environment;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ImageView;
    
    public class LoadImages extends Activity implements OnClickListener{
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.load_image);
                 
            ((ImageView)findViewById(R.id.imageView1)).setImageBitmap(BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/IMG2.png"));        
            findViewById(R.id.imageView1).setOnClickListener(this);       
        }
    
        @Override
        public void onClick(View v) {
            startActivity(new Intent(this, LoadFromSDActivity.class));
        }
    }
    
     
  2. Unicate, 06.01.2012 #2
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Also du darfst die Bilder auf keinen Fall alle gleichzeitig laden.

    Lad nur die, die du auch gerade anzeigen willst.
    Nicht benötigte Bilder mit bitmap.recycle() wieder frei geben. (Das wird wieder zu anderen Problemen führen, aber thats the way...)
     
  3. Bobert, 06.01.2012 #3
    Bobert

    Bobert Threadstarter Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    Danke, aber wie soll ich bitmap.recycle() in meinen Beispiel machen?

    Code:
        @Override
        protected void onStop() {
            super.onStop();
           // ((ImageView)findViewById(R.id.imageView1)). ??        
        }
    
    ?
     
  4. Unicate, 06.01.2012 #4
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Wenn du von der view ais nicht mehr an das bitmap Objekt selbst kommst, versuche dir vorher einen Verweis auf dieses zu sichern . BitmapFactory.decode liefert diese zurück.
    Wenns bloss die eine ist könntest du z.b. ne membervariable verwenden.

    Gesendet von meinem Desire HD mit Tapatalk
     
  5. strider, 06.01.2012 #5
    strider

    strider Erfahrener Benutzer

    Beiträge:
    208
    Erhaltene Danke:
    45
    Registriert seit:
    30.09.2011
    Phone:
    Nexus S
    Hast du im Manifest für für die beiden Activities android:launchMode="singleTask" eingetragen?
    Das sieht so aus als würdest du einen riesigen Rattenschwanz an Instanzen erzeugen.
     
    Bobert bedankt sich.
  6. Bobert, 06.01.2012 #6
    Bobert

    Bobert Threadstarter Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    Hallo strider,

    es sieht so aus, dass mit android:launchMode="singleTask" bzw. android:launchMode="singleInstance" das Problem beseitigt ist. Jetzt muss ich mal schauen, ob ich mir nicht ein neues eingehandelt habe damit?!

    Ich werde berichten, aber ich danke Euch schon (strider + Unicate) mal!

    Grüße Bobert
     
    Zuletzt bearbeitet: 06.01.2012
  7. strider, 06.01.2012 #7
    strider

    strider Erfahrener Benutzer

    Beiträge:
    208
    Erhaltene Danke:
    45
    Registriert seit:
    30.09.2011
    Phone:
    Nexus S
    Gern geschehen und viel Erfolg!
     
  8. Unicate, 07.01.2012 #8
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    [Edit:] Es war spät, das war Mist!
     

Diese Seite empfehlen