2014-06-11 11 views
10

to w związku z tym pytaniez wyjątkiem pamięci + analizującym pliku hprof zrzucić

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

stworzyłem plik zrzutu w pytaniu .. i to daje następujące informacje

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

tak co teraz można zrobić? jak mogę usunąć problem?

moi list_objects [kontekst] -inbound plik

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 jestem zdesperowany. jak mogę rozwiązać problem z pamięcią?

mój 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

wklej kod. A następnie przeanalizujemy. – Dev

+0

@DevCarlsberg Mam opublikowany mój główny plik .. Proszę sprawdzić .. – user3214173

+0

Dude przejść [Moja odpowiedź] (http://stackoverflow.com/questions/24156047/android-binary-xml-exception-when-changing-pictures/24157195 # 24157195). – Dev

Odpowiedz

1

wypróbować poniższy kod:

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

@DevCalsberg ten kod nie działa eclipse dosnt akceptuj go .. Zasoby res = getContext(). getResources(); home.setimagebitmap (b); oba te kody powodują błąd .. a także czy ten kod nie jest logicznie taki sam jak użyłem? – user3214173

1

Zwykle kiedy się tego rodzaju wyjątku na niskich urządzeń Ram to dlatego, że mam jakiś obrazek, aby drogie (wiele kb) dla tej rozdzielczości. Miałem dziwny problem, ponieważ po prostu użyłem katalogów xhdpi i hdpi drawables, na urządzeniach mdpi lub nawet ldpi, konwersja hdpi do właściwej rozdzielczości podnosi ten wyjątek, ponieważ nie można zmienić rozmiaru obrazu.

To się dzieje na każdym urządzeniu? Czy możesz sprawdzić, czy masz grafikę dla tych niskich urządzeń?

W dowolny sposób z plikiem HPOF można zobaczyć, jaki rodzaj obiektu lub co najmniej, którego działanie/widok ma problem. Musisz przeanalizować wszystkie te dane (nie ma planu głównego, aby znaleźć zasób, w którym zwija się twoja aplikacja), aby zobaczyć, który problem dotyczy.

Mam nadzieję, że to pomoże, każde pytanie, proszę pytać.

4

Chodzi o to, aby zmniejszyć próbkę obrazu tak, aby wyglądał dobrze na mniejszym ekranie i aby nie trzeba było ładować całej bitmapy do pamięci.

1) Najpierw uzyskaj rozmiar swojego ImageView/ekranu, na którym będziesz wyświetlać.

2) Odczytaj rozmiar mapy bitowej przechodząc w BitmapFactory.Options.inJustDecodeBounds. Da ci to rozmiar Bitmapy zamiast ładowania całej bitmapy.

3) Pobierz rozmiar próbnika. Oblicz stosunek wysokości i szerokości ekranu do wysokości i szerokości obrazu. Użyj najmniejszego tak, aby największy wymiar wyglądał dobrze.

4) Ostatecznie skorzystaj z poniższej funkcji, aby uzyskać obraz próbkowany w dół, który nie pożera twojej pamięci.

2) (kod)

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) (kod)

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; 
    } 
Powiązane problemy