日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android手机内存图片读取,有效解决Android加载大图片内存溢出的问题

發(fā)布時間:2025/3/20 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android手机内存图片读取,有效解决Android加载大图片内存溢出的问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天在交流群里,有人問我他經(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。