如何在Android應用當中避免內存溢出問題

一、內存溢出
現在的智能手機內存已經足夠大,但是對於一個應用程序來說智能手機當中稀缺的內存,仍然是應用程序的一大限制。在Android應用程序開發當中,最常見的內存溢出問題(OOM)是在加載圖片時出現的,尤其是在不知道圖片大小的情況下。
潛在的內存溢出操作主要包括以下幾點:
1、從網絡當中加載用戶特定的圖片。因為直到我們在下載圖片的時候我們才知道圖片的大小。
2、向Gallery加載圖片。因為現在智能手機的攝像頭有很高的分辨率,在加載圖片的時候需要最圖片進行處理,然後才能正常的使用。
請註意一點,Android系統是從系統全局的觀念來分配內存以加載圖片的,這就意味著,即使你的應用有足夠大的內存可用,內存溢出問題(out of memroy,OOM)仍然可能出現,因為所有的應用共享一個加載圖片的內存池(我們使用BitmapFactory進行解析)。
二、解決內存溢出問題
原文(Downsampling為瞭好理解,解釋為,程序A)。程序A通過調整像素,同時使其均衡化來降低圖片的分辨率。因為不管問題圖片是因為太大而不能再手機上正常顯現,這個圖片都會縮短其寬度以在ImageView當中顯示,當圖片在ImageView當中顯示時,我們會因為加載一些沒有必要的原始圖片而浪費掉內存。
因此,更加有效的加載圖片的時機是在其初始化處理的時候。
以下是處理代碼:
1: private static Bitmap getResizedImage(String path, byte[] data, int targetWidth){
   2:    
   3:     BitmapFactory.Options options = new BitmapFactory.Options();
   4:     options.inJustDecodeBounds = true;
   5:    
   6:     BitmapFactory.decodeFile(path, options);
   7:    
   8:     int width = options.outWidth;
   9:    
  10:     int ssize = sampleSize(width, targetWidth);
  11:   
  12:   
  13:     options = new BitmapFactory.Options();
  14:     options.inSampleSize = ssize;
  15:    
  16:     Bitmap bm = null;
  17:     try{
  18:         bm = decode(path, data, options);
  19:     }catch(OutOfMemoryError e){
  20:         AQUtility.report(e);
  21:     }
  22:    
  23:    
  24:     return bm;
  25:    
  26: }
  27: 
  28: private static int sampleSize(int width, int target){
  29:    
  30:     int result = 1;
  31:    
  32:     for(int i = 0; i < 10; i++){
  33:        
  34:         if(width < target * 2){
  35:             break;
  36:         }
  37:        
  38:         width = width / 2;
  39:         result = result * 2;
  40:        
  41:     }
  42:    
  43:     return result;
  44: }
三、AQuery
當在Android應用程序開發當中使用AQuery組件時,處理這個問題會變的更加的簡單。
Down sample from the Internet

   1: String url = "/wp-content/images1/20181015/5802797131_a729dac808_b313.jpg";           

   2: aq.id(R.id.image1).image(imageUrl, true, true, 200, 0);

 

Down sample image from File
   1: File file = new File(path);       
   2: //load image from file, down sample to target width of 300 pixels 
   3: aq.id(R.id.avatar).image(file, 300);
 作者:liuxian13183
 

發佈留言