Vraag out of memory exception + analyse van hprof file dump


dit hangt samen met deze vraag

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

ik heb het betreffende dumpbestand gemaakt .. en het geeft de volgende informatie

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

dus wat kan er nu worden gedaan ?? hoe los ik het probleem op?

mijn list_objects [context] -ingaand bestand

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

help me, ik ben wanhopig. hoe kan ik het geheugenprobleem oplossen ??

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

10
2018-06-11 06:02


oorsprong


antwoorden:


Het idee is om een ​​voorbeeld van je afbeelding te maken zodat deze er goed uitziet op het kleinere scherm en je de hele bitmap niet in het geheugen hoeft te laden.

1) Verkrijg eerst de grootte van uw ImageView / scherm waarop u zult zien.

2) Lees de grootte van je Bitmap door deze in te voeren BitmapFactory.Options.inJustDecodeBounds. Hiermee krijgt u de grootte van de bitmap in plaats van de volledige bitmap te laden.

3) Verkrijg een insample-formaat. Bereken de verhouding van hoogte en breedte van het scherm tot de hoogte en breedte van het beeld. Gebruik de kleinste zodat de grootste afmeting er goed uitziet.

4) Gebruik de onderstaande functie om de gedownloade afbeelding te verkrijgen die uw geheugen niet opslokt.

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

4
2018-04-14 21:42



Het toevoegen van largeHeap = "true" in uw manifest kan hierbij helpen. Hierdoor kan uw toepassing meer geheugen gebruiken.

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


2
2018-04-16 15:32



probeer de onderstaande code:

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

1
2018-06-11 09:56



Normaal gesproken krijg ik dit soort uitzonderingen op lage Ram-apparaten, omdat ik voor deze resolutie een of andere afbeelding te duur (veel kb) heb. Ik had een raar probleem omdat ik zojuist xhdpi en hdpi drawables directory's heb gebruikt, op mdpi of zelfs ldpi-apparaten verhoogt de hdpi-conversie naar de juiste resolutie deze uitzondering omdat de grootte van de afbeelding niet kan worden gewijzigd.

Het gebeurt op elk apparaat? Kon je controleren of je een specifieke grafische weergave hebt voor deze lage apparaten?

Elke manier met HPOF-bestand kunt u zien wat voor soort object of op zijn minst, die activiteit / weergave heeft het probleem. U moet al deze gegevens analyseren (er is geen masterplan om te vinden in welke bron uw app wordt samengevoegd) om te zien wat het probleem is.

Ik hoop dat dit helpt, elke vraag, aarzel dan niet om te vragen.


1
2018-04-13 09:10