Android手机内存图片读取,有效解决Android加载大图片内存溢出的问题
今天在交流群里,有人問我他經(jīng)常遇到加載圖片時內(nèi)存溢出的問題,遇到的情況還是在自己的測試機或者手機里沒有問題,做好了, 到了客戶手機里就內(nèi)存溢出了。其實有時候不同的手機和不同的系統(tǒng)對內(nèi)存的要求不一樣,尤其是圖片,所以可能會遇到這樣的問題。那我們怎么樣有效解決Android加載大圖片時內(nèi)存溢出的問題?
那么接下來,我們就來說說這個問題:
首先,我們要知道盡量的不要使用setImageResource或setImageBitmap或BitmapFactory.decodeResource來設(shè)置一張大圖,因為這些函數(shù)在完成decode后,最終都是要通過java層的createBitmap來完成的,需要消耗很多的內(nèi)存。所以,我們應(yīng)該先通過BitmapFactory.decodeStream方法,創(chuàng)建出一個bitmap,再將其設(shè)為ImageView的 source,decodeStream最大的好處和秘密在于其直接調(diào)用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap,從而節(jié)省了java層的內(nèi)存空間。
其實,如果在讀取時加上圖片的Config參數(shù),可以很有效的減少加載的內(nèi)存,從而能很有效的阻止拋out of Memory異常。
另外,decodeStream直接拿的圖片來讀取字節(jié)碼了,不會根據(jù)機器的各種分辨率來自動適應(yīng)屏幕, 使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相應(yīng)的圖片資源, 否則在不同分辨率機器上都是同樣大小,顯示出來的大小就不對了,不適配。
現(xiàn)在給大家比較好用的方法,如下:/**
*?以最省內(nèi)存的方式讀取本地資源的圖片
*
*?@param?context
*?@param?resId
*?@return
*/
public?static?Bitmap?readBitMap(Context?context,?int?resId)?{
BitmapFactory.Options?opt?=?new?BitmapFactory.Options();
opt.inPreferredConfig?=?Bitmap.Config.RGB_565;
opt.inPurgeable?=?true;
opt.inInputShareable?=?true;
//?獲取資源圖片
InputStream?is?=?context.getResources().openRawResource(resId);
return?BitmapFactory.decodeStream(is,?null,?opt);
}
其實通過下面的兩種方式也可以:
1. InputStream is = this.getResources().openRawResource(R.drawable.pic1);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 5; ? //width,hight設(shè)為原來的五分之一
Bitmap btp =BitmapFactory.decodeStream(is,null,options);
2. if(!bmp.isRecycle() ){
bmp.recycle() ? //回收圖片所占的內(nèi)存
system.gc() ?//提醒系統(tǒng)及時回收
}
我也稍微再說一下圖片占用進(jìn)程的內(nèi)存算法吧:
android中處理圖片的基礎(chǔ)類是Bitmap,顧名思義,就是位圖。占用內(nèi)存的算法如下:圖片的width*height*Config。如果Config設(shè)置為ARGB_8888,那么上面的Config就是4。一張480*320的圖片占用的內(nèi)存就是480*320*4 byte。其實是在默認(rèn)情況下android進(jìn)程的內(nèi)存占用量為16M,因為Bitmap他除了java中持有數(shù)據(jù)外,底層C++的skia圖形庫還會持有一個SKBitmap對象,因此一般圖片占用內(nèi)存推薦大小應(yīng)該不超過8M。這個大小是可以調(diào)整,但是只有在編譯源代碼時可以設(shè)置這個大小的參數(shù)。
總結(jié)
以上是生活随笔為你收集整理的Android手机内存图片读取,有效解决Android加载大图片内存溢出的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android webview 设置文字
- 下一篇: 宇泽电影工作室网页HTML语言,4.4宇