当前位置:操作系统 > 安卓/Android >>

如何在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 = "http://farm6.static.flickr.com/5035/5802797131_a729dac808_b.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
 

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,