2014-06-11 9 views
10

dies ist im Zusammenhang mit dieser Frageaus Speicherausnahme + Analyse Hprof Datei Dump

java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)

i die Dump-Datei in Frage erstellt .. und es gibt so Informationen folgende

One instance of "byte[]" loaded by "<system class loader>" occupies 1,10,59,216 
(51.02%) bytes. The memory is accumulated in one instance of "byte[]" 
loaded by "<system class loader>". 

Keywords byte[] 

jetzt was kann getan werden ?? Wie lösche ich das Problem ??

mein list_objects [context] -inbound Datei

CLASS NAME                 SHALLOW HEAP RETAINED HEAP 
byte[11059200] @ 0xb4979590            | 1,10,59,216 | 1,10,59,216 
mBuffer android.graphics.Bitmap @ 0xb3dc68d8        |48   | 48 
mBitmap android.graphics.drawable.BitmapDrawable @ 0xb3dbba60    | 72   | 144 
mBackground android.widget.RelativeLayout @ 0xb3db3fc0     |512   | 10,144 
mBitmap android.graphics.drawable.BitmapDrawable$BitmapState @ 0xb3dc0068 |40   | 40 
mBitmapState android.graphics.drawable.BitmapDrawable @ 0xb3dbba60  |72   | 144 
referent java.lang.ref.WeakReference @ 0xb3dc2d68       |24   | 24 

pls help i bin verzweifelt. Wie kann ich das Speicherproblem lösen?

mein home_screen.java

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home_page); 
    main(); 
private void main() { 
    // TODO Auto-generated method stub 


    final Button home; 
    final Button aboutus; 
    final Button contacts; 
    final Button clients; 
    final Button services; 

    try 
    { 

    home = (Button)findViewById(R.id.btnHome); 
    aboutus = (Button)findViewById(R.id.btnAboutus); 
    clients = (Button)findViewById(R.id.btnClients); 
    contacts = (Button)findViewById(R.id.btnContacts); 
    services = (Button)findViewById(R.id.btnServices); 

    home.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.home1); 
      Drawable d = new BitmapDrawable(getResources(),b);    
      home.setBackgroundDrawable(d); 
      System.gc(); 
      Intent myIntent = new Intent(Home_Screen.this, Button_Anime.class); 
      startActivity(myIntent); 
     } 
    }); 
    aboutus.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.about1); 
      Drawable d = new BitmapDrawable(getResources(),b); 
      aboutus.setBackgroundDrawable(d); 
      Intent myIntent = new Intent(Home_Screen.this, AboutUs.class); 
      startActivity(myIntent); 
     } 
    }); 
    clients.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.clients1); 
      Drawable d = new BitmapDrawable(getResources(),b); 
      clients.setBackgroundDrawable(d); 
      Intent myIntent = new Intent(Home_Screen.this, Clients.class); 
      startActivity(myIntent); 
     } 
    }); 
    contacts.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.contact1); 
      Drawable d = new BitmapDrawable(getResources(),b); 
      contacts.setBackgroundDrawable(d); 
      Intent myIntent = new Intent(Home_Screen.this, Contacts.class); 
      startActivity(myIntent); 
     } 
    }); 
    services.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.services1); 
      Drawable d = new BitmapDrawable(getResources(),b); 
      services.setBackgroundDrawable(d); 
      Intent myIntent = new Intent(Home_Screen.this, Services.class); 
      startActivity(myIntent); 
     } 
    }); 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
+0

fügen Sie Ihre code.so, die wir analysieren wil. – Dev

+0

@DevCarlsberg Ich habe meine Hauptdatei geschrieben .. pls überprüfen .. – user3214173

+0

Dude gehen durch [Meine diese Antwort] (http://StackOverflow.com/Questions/24156047/android-binary-xml-Exception-when-changing-Pictures/24157195 # 24157195) wird Ihnen helfen. – Dev

Antwort

1

versuchen, den folgenden Code:

Resources res = getContext().getResources(); 
int id = R.drawable.image; 
Bitmap b = BitmapFactory.decodeResource(res, id);  
_img .setimagebitmap(b); 
+0

@DevCalsberg dieser Code funktioniert nicht Eclipse dosnt akzeptieren es .. Ressourcen res = getContext(). getResources(); home.setimagebitmap (b); beide Codes erzeugen Fehler .. und ist auch nicht dieser Code logisch der gleiche wie was ich verwendete ??? – user3214173

1

Normalerweise, wenn ich diese Art von Ausnahme auf Low Ram Geräte bekommen es ist, weil ich eine Art von Bild zu teuer haben (viele kb) für diese Entschließung. Ich hatte ein seltsames Problem, weil ich nur xhdpi und hdpi Drawables-Verzeichnisse verwendet, auf mdpi oder sogar ldpi-Geräten die hdpi-Konvertierung auf die richtige Auflösung diese Ausnahme auslösen, weil die Größe des Bildes nicht ändern kann.

Es passiert auf jedem Gerät? Könnten Sie überprüfen, ob Sie eine bestimmte Grafik für diese niedrigen Geräte haben?

Jeder Weg mit HPOF-Datei können Sie sehen, welche Art von Objekt oder zumindest, welche Aktivität/Ansicht hat das Problem. Sie müssen alle diese Daten analysieren (es gibt keinen Masterplan, um die Ressource zu finden, die Ihre App kollabiert), um zu sehen, welche das Problem hat.

Hoffe, das hilft, jede Frage, zögern Sie nicht zu fragen.

4

Die Idee besteht darin, Ihr Bild so herunterzuspielen, dass es auf dem kleineren Bildschirm gut aussieht und Sie nicht die gesamte Bitmap in den Speicher laden müssen.

1) Ermitteln Sie zuerst die Größe Ihres ImageView/Bildschirms, auf dem Sie angezeigt werden.

2) Lesen Sie die Größe der Bitmap, indem Sie BitmapFactory.Options.inJustDecodeBounds übergeben. Dadurch erhalten Sie die Größe der Bitmap, anstatt die gesamte Bitmap zu laden.

3) Holen Sie sich eine Beispielgröße. Berechnen Sie das Verhältnis von Höhe und Breite des Bildschirms zur Bildhöhe und -breite. Verwenden Sie den kleinsten, damit die größte Dimension gut aussieht.

4) Verwenden Sie die unten stehende Funktion, um das Downsampled-Bild zu erhalten, das Ihren Speicher nicht auffressen wird.

2) (Code)

BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); 
bitmapOptions.inJustDecodeBounds = true; 
BitmapFactory.decodeStream(inputStream, null, bitmapOptions); 
int imageWidth = bitmapOptions.outWidth; 
int imageHeight = bitmapOptions.outHeight; 
inputStream.close(); 

4) (Code)

private Bitmap downscaleBitmapUsingDensities(final int sampleSize,final int imageResId) 
    { 
    final Options bitmapOptions=new Options(); 
    bitmapOptions.inDensity=sampleSize; 
    bitmapOptions.inTargetDensity=1; 
    final Bitmap scaledBitmap=BitmapFactory.decodeResource(getResources(),imageResId,bitmapOptions); 
    scaledBitmap.setDensity(Bitmap.DENSITY_NONE); 
    return scaledBitmap; 
    } 
Verwandte Themen