Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android異步獲取網絡圖片並處理圖片出現Out Of Memory內存溢出的解決辦法

Android異步獲取網絡圖片並處理圖片出現Out Of Memory內存溢出的解決辦法

編輯:Android開發實例

 測試環境為Adnroid 2.1以上。

1:AndroidManifest.xml 權限配置:

添加互聯網訪問權限:

<uses-permission android:name="android.permission.INTERNET" />

2.異步圖片類 ImageDownloadTask 

  1. import java.io.ByteArrayOutputStream; 
  2. import java.io.IOException; 
  3. import java.io.InputStream; 
  4. import java.net.MalformedURLException; 
  5. import java.net.URL; 
  6. import android.graphics.Bitmap; 
  7. import android.graphics.BitmapFactory; 
  8. import android.os.AsyncTask; 
  9. import android.widget.ImageView; 
  10.  
  11.  
  12. public class ImageDownloadTask extends AsyncTask<Object, Object, Bitmap> { 
  13.     private ImageView imageView = null; 
  14.     /*** 
  15.      * 這裡獲取到手機的分辨率大小 
  16.      * */ 
  17.     public  void setDisplayWidth(int width) { 
  18.         _displaywidth = width; 
  19.     } 
  20.  
  21.     public  int getDisplayWidth() { 
  22.         return _displaywidth; 
  23.     } 
  24.  
  25.     public  void setDisplayHeight(int height) { 
  26.         _displayheight = height; 
  27.     } 
  28.  
  29.     public  int getDisplayHeight() { 
  30.         return _displayheight; 
  31.     } 
  32.  
  33.     public  int getDisplayPixels() { 
  34.         return _displaypixels; 
  35.     } 
  36.      
  37.     private  int _displaywidth = 480; 
  38.     private  int _displayheight = 800; 
  39.     private  int _displaypixels = _displaywidth * _displayheight; 
  40.  
  41.     @Override 
  42.     protected Bitmap doInBackground(Object... params) { 
  43.         // TODO Auto-generated method stub 
  44.         Bitmap bmp = null; 
  45.         imageView = (ImageView) params[1]; 
  46.          
  47.         try { 
  48.             String url = (String) params[0]; 
  49.             bmp = getBitmap(url, _displaypixels,true); 
  50.         } catch (Exception e) { 
  51.              
  52.             return null; 
  53.         } 
  54.         return bmp; 
  55.     } 
  56.  
  57.     protected void onPostExecute(Bitmap result) { 
  58.         if (imageView != null&&result!=null) { 
  59.             imageView.setImageBitmap(result); 
  60.             if (null != result && result.isRecycled() == false) 
  61.                 System.gc(); 
  62.         } 
  63.     } 
  64.     /** 
  65.      * 通過URL獲得網上圖片。如:http://www.xxxxxx.com/xx.jpg 
  66.      * */ 
  67.     public Bitmap getBitmap(String url, int displaypixels, Boolean isBig) throws MalformedURLException, IOException { 
  68.         Bitmap bmp = null; 
  69.         BitmapFactory.Options opts = new BitmapFactory.Options(); 
  70.          
  71.         InputStream stream = new URL(url).openStream(); 
  72.         byte[] bytes = getBytes(stream); 
  73.         //這3句是處理圖片溢出的begin( 如果不需要處理溢出直接 opts.inSampleSize=1;) 
  74.         opts.inJustDecodeBounds = true; 
  75.         BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts); 
  76.         opts.inSampleSize = computeSampleSize(opts, -1, displaypixels); 
  77.         //end 
  78.         opts.inJustDecodeBounds = false; 
  79.         bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts); 
  80.         return bmp; 
  81.     } 
  82.     /** 
  83.      * 數據流轉成btyle[]數組 
  84.      * */ 
  85.     private byte[] getBytes(InputStream is) { 
  86.  
  87.         ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  88.         byte[] b = new byte[2048]; 
  89.         int len = 0; 
  90.         try { 
  91.             while ((len = is.read(b, 0, 2048)) != -1) { 
  92.                 baos.write(b, 0, len); 
  93.                 baos.flush(); 
  94.             } 
  95.         } catch (IOException e) { 
  96.                 e.printStackTrace(); 
  97.         } 
  98.         byte[] bytes = baos.toByteArray(); 
  99.         return bytes; 
  100.     } 
  101.     /**** 
  102.     *    處理圖片bitmap size exceeds VM budget (Out Of Memory 內存溢出) 
  103.     */ 
  104.     private int computeSampleSize(BitmapFactory.Options options, 
  105.             int minSideLength, int maxNumOfPixels) { 
  106.         int initialSize = computeInitialSampleSize(options, minSideLength, 
  107.                 maxNumOfPixels); 
  108.  
  109.         int roundedSize; 
  110.         if (initialSize <= 8) { 
  111.             roundedSize = 1; 
  112.             while (roundedSize < initialSize) { 
  113.                 roundedSize <<= 1; 
  114.             } 
  115.         } else { 
  116.             roundedSize = (initialSize + 7) / 8 * 8; 
  117.         } 
  118.         return roundedSize; 
  119.     } 
  120.      
  121.     private int computeInitialSampleSize(BitmapFactory.Options options, 
  122.             int minSideLength, int maxNumOfPixels) { 
  123.         double w = options.outWidth; 
  124.         double h = options.outHeight; 
  125.         int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math 
  126.                 .sqrt(w * h / maxNumOfPixels)); 
  127.         int upperBound = (minSideLength == -1) ? 128 : (int) Math.min( 
  128.                 Math.floor(w / minSideLength), Math.floor(h / minSideLength)); 
  129.  
  130.         if (upperBound < lowerBound) { 
  131.             return lowerBound; 
  132.         } 
  133.  
  134.         if ((maxNumOfPixels == -1) && (minSideLength == -1)) { 
  135.             return 1; 
  136.         } else if (minSideLength == -1) { 
  137.             return lowerBound; 
  138.         } else { 
  139.             return upperBound; 
  140.         } 
  141.     } 

3.測試調用代碼

  1. @Override 
  2.     public void onCreate(Bundle savedInstanceState) { 
  3.         super.onCreate(savedInstanceState); 
  4.         setContentView(R.layout.main); 
  5.         ImageDownloadTask imgtask =new ImageDownloadTask(); 
  6.          
  7.         /**這裡是獲取手機屏幕的分辨率用來處理 圖片 溢出問題的。begin*/ 
  8.         DisplayMetrics dm = new DisplayMetrics(); 
  9.         getWindowManager().getDefaultDisplay().getMetrics(dm); 
  10.         imgtask.setDisplayWidth(dm.widthPixels); 
  11.         imgtask.setDisplayHeight(dm.heightPixels); 
  12.         //end 
  13.         ImageView imageView_test= (ImageView)findViewById(R.id.imageView_test); 
  14.         
  15.         imgtask.execute("http://pic.test.com/big/7515/201201031116491.jpg",imageView_test); 
  16.          
  17.     } 

 

4.小結

主要是通過   extends AsyncTask<Object, Object, Bitmap> 來實現異步的。

圖片Out Of Memory 內存溢出 這一塊操作,在實際應用中應該考慮淡定抽取出來。這裡為了方便放進來了。 溢出處理實際上就是獲得設備分辨率把圖片進行壓縮。

 

轉自:http://www.cnblogs.com/yeqw1985/archive/2013/02/06/2908190.html

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved