2014-06-11 65 views
10

這是這個問題出內存異常+分析HPROF文件的轉儲

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

我創建轉儲文件的問題有關..它給出以下信息

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

所以現在可以做些什麼?我如何清除問題?

我list_objects [背景] -inbound文件

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 

請幫助我絕望。我如何解決內存問題?

我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

粘貼您的code.so,我們將分析。 – Dev

+0

@DevCarlsberg我已經發布了我的主文件..請檢查.. – user3214173

+0

老兄經歷[我的這個答案](http://stackoverflow.com/questions/24156047/android-binary-xml-exception-when-changing-pictures/24157195#24157195)會幫助你。 – Dev

回答

1

試試下面的代碼:

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

@DevCalsberg這個代碼dosn't工作eclipse dosnt接受它..資源res = getContext()。getResources(); home.setimagebitmap(b)中;這兩個代碼產生錯誤..也不是這個代碼在邏輯上與我使用的相同? – user3214173

1

通常,當我得到這樣的低RAM器件例外的,那是因爲我有某種形象的昂貴(許多kb)爲這個決議。 我有一個奇怪的問題,因爲我只使用xhdpi和hdpi drawables目錄,在mdpi甚至ldpi設備上將hdpi轉換爲正確的分辨率引發此異常,因爲無法調整圖像大小。

它發生在任何設備上?你可以檢查你有這個低設備的特定圖形?

任何方式與HPOF文件,你可以看到什麼樣的對象或至少,至少有什麼活動/視圖有問題。 您需要分析所有這些數據(沒有主計劃來查找它正在合攏應用程序的資源),以查看哪些數據存在問題。

希望這可以幫助,任何問題,請隨時問。

4

這個想法是縮小圖像的樣本,使它在較小的屏幕上看起來很好,並且不必在內存中加載整個位圖。

1)首先獲取您要顯示的ImageView /屏幕的大小。

2)通過傳入BitmapFactory.Options.inJustDecodeBounds來讀取您的位圖大小。這將給你的位圖的大小,而不是加載整個位圖。

3)獲取insample大小。計算屏幕的高度和寬度與圖像高度和寬度的比率。使用最小的一個,以便最大尺寸看起來不錯。

4)最終使用下面的函數來獲取不會吃掉你的記憶的下采樣圖像。

2)(代碼)

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)(代碼)

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; 
    } 
相關問題