一网棍、為什么加載大圖片時(shí)會(huì)產(chǎn)生OutOfMemoryError?
? ? ? ?這是因?yàn)锳ndroid采用圖片格式是ARGB-->這里A代表透明度、R是紅色、Green是綠色肢娘、Blue是藍(lán)色芭逝。
? ? ? ?加載圖片時(shí)之所以產(chǎn)生的OOM是因?yàn)閳D片占用不存超出了系統(tǒng)的規(guī)范塌碌,一般我們用屏幕的分辨率比如720*1080系統(tǒng)分配分內(nèi)存為32m,而一個(gè)圖片分辨率3120*4208占用的內(nèi)存為3120*4208*4=52515840即53m旬盯,這樣的話系統(tǒng)肯定會(huì)oom
二誊爹、解決OOM:
? ? ? ?<1>蹬刷、獲取屏幕的大小:
WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
//int width = wm.getDefaultDisPlay().getWidth;
//int height= wm.getDefaultDisPlay().getHeight;
Point point = new Point();
wm.getDefaultDisplay().getSize(point);
int width = point.x;
int height = point.y;
//兩種區(qū)別:第二種版本14以上包括14才能使用
? ? ? ?<2>频丘、獲取圖片的大邪斐伞:
//BitMapFactory.decodeFile(xx,xxx);
//第一個(gè)參數(shù)代表圖片路徑,第二個(gè)參數(shù)代表你設(shè)置的options
Options options = new Options();
options.inJustDecodeBounds=true;//不會(huì)把圖片加到內(nèi)存搂漠,但是會(huì)獲取圖片的信息迂卢,核心采用的是Native這里不多講
BitMap ?bitmap = ?BitMapFactory.decodeFile(file.getAbsPath(),options);
int imgWidth = options.outWidth;
int imgHeight = options.outHeight;
? ? ? ?<3>、計(jì)算縮放比例:
int scaleX = imgWidth/width;
int scaleY = imgHeight/height;
int scale = scaleX>scaleY?scaleX:scaleY
? ? ? ?<4>桐汤、獲取縮小后的圖片:
options.inJustDecodeBounds = false;//因?yàn)橹霸O(shè)置了圖片不能加載到內(nèi)存而克,這里需要重新更改能加載到內(nèi)存。
options.inSampleSize = scale;
BitMap? bitmap =? BitMapFactory.decodeFile(file.getAbsPath(),options);
? ? ? ?<5>怔毛、顯示圖片:
img.setImageBitmap(bitmap);
//原來一個(gè)圖片分辨率3120*4208占用的內(nèi)存為3120*4208*4=52515840即53m员萍,這樣的話系統(tǒng)肯定會(huì)oom
bitmap.getByCount();
//現(xiàn)在打印出結(jié)果圖片占用內(nèi)存3282240/1024/720=3m,這樣就能避免oom。