Out of memory Ausnahme + analysieren hprof file dump

Dies steht im Zusammenhang mit dieser frage

Java.lang.OutOfMemoryError bei android.graphics.BitmapFactory.nativeDecodeAsset (Native Methode)

  • Wie kann ich nach dem Ändern der Ansichtsfensterbreite auf die Orientierungsänderung passen?
  • Unterscheidung von Entwicklungsmodus und Freigabemodus-Umgebungseinstellungen auf Android
  • Android-API-Ebene <19 und "versuchen kann die automatische Ressourcenverwaltung" Warnung verwenden
  • Android: LoaderCallbacks.OnLoadFinished genannt zweimal
  • Starten Sie den Android Service nach allen 5 Minuten
  • Header-Ansicht-Höhe in einem ListView
  • Ich habe die Dump-Datei in Frage .. und es gibt folgende Informationen

    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[] 

    Also jetzt was kann man machen ?? Wie kann ich das Problem löschen?

    Meine list_objects [context] -inbound file

     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 helfen ich 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(); } } 

  • RecyclerView LayoutManager verschiedene Spanne zählt auf verschiedenen Zeilen
  • Best Practices für die Behandlung von UI-Veranstaltungen
  • Android - Vergrößern Sie den linken Rand mit Animation
  • Was sind die Hauttypen in Android Studio?
  • Was ist los mit dem ICS Holo Dialog Thema?
  • Java / Android - Wie man eine vollständige Stapelspur ausdruckt?
  • 4 Solutions collect form web for “Out of memory Ausnahme + analysieren hprof file dump”

    Die Idee ist es, dein Bild abzutasten, damit es auf dem kleineren Bildschirm gut aussieht und dass du die gesamte Bitmap nicht im Speicher laden musst.

    1) Zuerst erhalten Sie die Größe Ihres ImageView / Bildschirms, auf dem Sie sich befinden.

    2) Lesen Sie die Größe von Ihnen Bitmap, indem Sie in BitmapFactory.Options.inJustDecodeBounds . Dies gibt Ihnen die Größe der Bitmap anstatt die gesamte Bitmap zu laden.

    3) Holen Sie sich eine Mustergröße. Berechnen Sie das Verhältnis von Höhe und Breite des Bildschirms zu Bildhöhe und -breite. Verwenden Sie die kleinste, so dass die größte Dimension gut aussieht.

    4) Finale verwenden Sie die Funktion unten, um die unten abgetasteten Bild, das nicht essen Sie Ihre Erinnerung zu bekommen.

    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; } 

    Das Hinzufügen von largeHeap = "true" in deinem Manifest kann helfen. Dies ermöglicht es Ihrer Anwendung, mehr Speicher zu nutzen.

    Siehe: http://developer.android.com/guide/topics/manifest/application-element.html

    Versuchen Sie den folgenden Code:

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

    Normalerweise, wenn ich diese Art von Ausnahme auf niedrigen Ram-Geräten bekomme, ist es, weil ich irgendeine Art von Bild zu teuer (viele kb) für diese Auflösung habe. Ich hatte ein seltsames Problem, weil ich gerade verwendet xhdpi und hdpi Drawables Verzeichnisse, auf mdpi oder sogar ldpi Geräte die hdpi Umwandlung in die richtige Auflösung erhöhen diese Ausnahme, weil kann nicht die Größe des Bildes.

    Es passiert auf jedem Gerät? Könnten Sie überprüfen, dass 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. Du musst alle diese Daten analysieren (es gibt keinen Masterplan, um die Ressource zu finden, die es deiner App zusammenbricht), um zu sehen, welches das Problem hat.

    Hoffe, das hilft, jede Frage, bitte fühlen Sie sich frei zu fragen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.