国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

解決Android解析圖片的OOM問題的方法!!!

2019-12-12 04:35:59
字體:
來源:轉載
供稿:網友

大家好,今天給大家分享的是解決解析圖片的出現oom的問題,我們可以用BitmapFactory這里的各種Decode方法,如果圖片很小的話,不會出現oom,但是當圖片很大的時候

就要用BitmapFactory.Options這個東東了,Options里主要有兩個參數比較重要.

options.inJustDecodeBounds = false/true; //圖片壓縮比例. options.inSampleSize = ssize; 

我們去解析一個圖片,如果太大,就會OOM,我們可以設置壓縮比例inSampleSize,但是這個壓縮比例設置多少就是個問題,所以我們解析圖片可以分為倆個步驟,第一步就是

獲取圖片的寬高,這里要設置Options.inJustDecodeBounds=true,這時候decode的bitmap為null,只是把圖片的寬高放在Options里,然后第二步就是設置合適的壓縮比例inSampleSize,這時候獲得合適的Bitmap.這里我畫了簡單的流程圖,如下:

為了讓大家更容易理解,我這里做了一個簡單的demo,主要功能就是一個界面里有個ImageView,點擊ImageView的時候,進入本地相冊,選擇一個圖片的時候,ImageView控件顯示選擇的圖片。Demo的步驟如下:

第一步新建一個Android工程命名為ImageCacheDemo.目錄結構如下:

第二步新建一個ImageCacheUtil.Java工具類,代碼如下:

package com.tutor.oom; import java.io.InputStream;  import android.content.ContentResolver; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.net.Uri;  /**  * @author frankiewei.  * 工具類.  */ public class ImageCacheUtil {    /**    * 獲取合適的Bitmap平時獲取Bitmap就用這個方法吧.    * @param path 路徑.    * @param data byte[]數組.    * @param context 上下文    * @param uri uri    * @param target 模板寬或者高的大小.    * @param width 是否是寬度    * @return    */   public static Bitmap getResizedBitmap(String path, byte[] data,       Context context,Uri uri, int target, boolean width) {     Options options = null;      if (target > 0) {        Options info = new Options();       //這里設置true的時候,decode時候Bitmap返回的為空,       //將圖片寬高讀取放在Options里.       info.inJustDecodeBounds = false;              decode(path, data, context,uri, info);              int dim = info.outWidth;       if (!width)         dim = Math.max(dim, info.outHeight);       int ssize = sampleSize(dim, target);        options = new Options();       options.inSampleSize = ssize;      }      Bitmap bm = null;     try {       bm = decode(path, data, context,uri, options);     } catch(Exception e){       e.printStackTrace();     }     return bm;    }      /**    * 解析Bitmap的公用方法.    * @param path    * @param data    * @param context    * @param uri    * @param options    * @return    */   public static Bitmap decode(String path, byte[] data, Context context,       Uri uri, BitmapFactory.Options options) {      Bitmap result = null;      if (path != null) {        result = BitmapFactory.decodeFile(path, options);      } else if (data != null) {        result = BitmapFactory.decodeByteArray(data, 0, data.length,           options);      } else if (uri != null) {       //uri不為空的時候context也不要為空.       ContentResolver cr = context.getContentResolver();       InputStream inputStream = null;        try {         inputStream = cr.openInputStream(uri);         result = BitmapFactory.decodeStream(inputStream, null, options);         inputStream.close();       } catch (Exception e) {         e.printStackTrace();       }      }      return result;   }         /**    * 獲取合適的sampleSize.    * 這里就簡單實現都是2的倍數啦.    * @param width    * @param target    * @return    */   private static int sampleSize(int width, int target){             int result = 1;            for(int i = 0; i < 10; i++){                if(width < target * 2){           break;         }                 width = width / 2;         result = result * 2;               }             return result;     } } 

第三步:修改ImageCacheDemoActivity.java代碼如下:

package com.tutor.oom;  import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView;  /**  * @author frankiewei.  * 解決圖片普通OOM的Demo.  */ public class ImageCacheDemoActivity extends Activity {         /**    * 顯示圖片的ImageView.    */   private ImageView mImageView;      /**    * 打開本地相冊的requestcode.    */   public static final int OPEN_PHOTO_REQUESTCODE = 0x1;      /**    * 圖片的target大小.    */   private static final int target = 400;         @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);          setupViews();   }      private void setupViews(){     mImageView = (ImageView)findViewById(R.id.imageview);     mImageView.setOnClickListener(new OnClickListener() {              public void onClick(View v) {         openPhotos();             }     });   }      /**    * 打開本地相冊.    */   private void openPhotos() {      Intent intent = new Intent(Intent.ACTION_PICK, null);     intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,         "image/*");      startActivityForResult(intent, OPEN_PHOTO_REQUESTCODE);    }      @Override   protected void onActivityResult(int requestCode, int resultCode, Intent data) {     switch (requestCode) {     case OPEN_PHOTO_REQUESTCODE:       if(resultCode == RESULT_OK){         //如果用這個方法,Options為null時候,就是默認decode會出現oom哦.         //Bitmap bm = ImageCacheUtil.decode(null, null,          //   ImageCacheDemoActivity.this, data.getData(), null);                  //這里調用這個方法就不會oom.

主站蜘蛛池模板:
临高县|
通化市|
明溪县|
元阳县|
和田县|
罗源县|
明水县|
平谷区|
平阳县|
闽清县|
宜章县|
定陶县|
浪卡子县|
林甸县|
陵川县|
炎陵县|
东方市|
绥滨县|
阿克苏市|
资阳市|
利津县|
鄯善县|
漳州市|
元氏县|
林州市|
灌阳县|
固阳县|
万载县|
吴川市|
锡林郭勒盟|
蒙城县|
纳雍县|
长宁县|
马尔康县|
普格县|
西城区|
五寨县|
虹口区|
淮滨县|
徐闻县|
娄底市|