android 防止圖片OOM

圖片像素

Android中圖片有四種屬性姓蜂,分別是:
ALPHA_8:每個像素占用1byte內(nèi)存
ARGB_4444:每個像素占用2byte內(nèi)存
ARGB_8888:每個像素占用4byte內(nèi)存 (默認(rèn))
RGB_565:每個像素占用2byte內(nèi)存

BitmapFactory.Options opt = new BitmapFactory.Options();  
 opt.inPreferredConfig = Bitmap.Config.RGB_565; // 圖像以RGB_565讀取

Android默認(rèn)的顏色模式為ARGB_8888,這個顏色模式色彩最細(xì)膩忠聚,顯示質(zhì)量最高赂蕴。但同樣的柳弄,占用的內(nèi)存也最大。 所以在對圖片效果不是特別高的情況下使用RGB_565(565沒有透明度屬性)

圖片大小邊界壓縮

直接使用ImageView顯示bitmap會占用較多資源概说,特別是圖片較大的時候语御,可能導(dǎo)致崩潰。
使用BitmapFactory.Options設(shè)置inSampleSize, 這樣做可以減少對系統(tǒng)資源的要求席怪。
屬性值inSampleSize表示縮略圖大小為原始圖片大小的幾分之一,即如果這個值為2纤控,則取出的縮略圖的寬和高都是原始圖片的1/2挂捻,圖片大小就為原始大小的1/4。

圖片OOM的原理:
假設(shè)一張圖片的寬高為2600 * 1800 像素船万,每個像素是ARGB_8888,則其直接拉進(jìn)內(nèi) 存刻撒,占用的內(nèi)存大小為:
2600 * 1800 * 4byte = 18720000byte = 17.8M
若展示此圖片的ImageView大小僅為260 * 180px,則加載這么大的圖片是沒什么意義的耿导,經(jīng)計(jì)算声怔,壓縮比為10(2600 / 260),即inSampleSize = 10舱呻;
經(jīng)過邊界壓縮后醋火,圖片的大小為:
260 * 180 * 4byte = 0.18M

        BitmapFactory.Options newOpts = new BitmapFactory.Options();  
        //開始讀入圖片悠汽,此時把options.inJustDecodeBounds 設(shè)回true了  
        newOpts.inJustDecodeBounds = true;  
        Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此時返回bm為空  
  
        newOpts.inJustDecodeBounds = false;  
        int w = newOpts.outWidth;  
        int h = newOpts.outHeight;  
       
        float hh = 260f;//這里設(shè)置高度為260f
        float ww = 180f;//這里設(shè)置寬度為180f
        //縮放比。由于是固定比例縮放芥驳,只用高或者寬其中一個數(shù)據(jù)進(jìn)行計(jì)算即可  
        int be = 1;//be=1表示不縮放  
        if (w > h && w > ww) {//如果寬度大的話根據(jù)寬度固定大小縮放  
            be = (int) (newOpts.outWidth / ww);  
        } else if (w < h && h > hh) {//如果高度高的話根據(jù)寬度固定大小縮放  
            be = (int) (newOpts.outHeight / hh);  
        }  
        if (be <= 0)  
            be = 1;  
        newOpts.inSampleSize = be;//設(shè)置縮放比例  
        //重新讀入圖片柿冲,注意此時已經(jīng)把options.inJustDecodeBounds 設(shè)回false了  
        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  
        return compressImage(bitmap);//壓縮好比例大小后再進(jìn)行質(zhì)量壓縮  
    }  

圖片回收

使用Bitmap過后,就需要及時的調(diào)用Bitmap.recycle()方法來釋放Bitmap占用的內(nèi)存空間兆旬,而不要等Android系統(tǒng)來進(jìn)行釋放假抄。

// 先判斷是否已經(jīng)回收  

if(bitmap != null && !bitmap.isRecycled()){  

    // 回收并且置為null  

    bitmap.recycle();  

    bitmap = null;  

}  

System.gc();

常見圖片加載框架

Glide

目前用的這個

Univeral-Image-Loader

l 多線程下載圖片,圖片可以來源于網(wǎng)絡(luò)丽猬,文件系統(tǒng)宿饱,項(xiàng)目文件夾assets中以及drawable中等
l 支持隨意的配置ImageLoader,例如線程池脚祟,圖片下載器谬以,內(nèi)存緩存策略,硬盤緩存策略愚铡,圖片顯示選項(xiàng)以及其他的一些配置
l 支持圖片的內(nèi)存緩存蛉签,文件系統(tǒng)緩存或者SD卡緩存
l 支持圖片下載過程的監(jiān)聽
l 根據(jù)控件(ImageView)的大小對Bitmap進(jìn)行裁剪,減少Bitmap占用過多的內(nèi)存
l 較好的控制圖片的加載過程沥寥,例如暫停圖片加載碍舍,重新開始加載圖片,一般使用在ListView,GridView中邑雅,滑動過程中暫停加載圖片片橡,停止滑動的時候去加載圖片
l 提供在較慢的網(wǎng)絡(luò)下對圖片進(jìn)行加載

Picasso

l 使用ListView,GridView的時候淮野,自動檢測Adapter的重用捧书,取消下載,使用緩存
l 將圖像進(jìn)行變換骤星,以更好的適應(yīng)布局控件等经瓷,減小內(nèi)存開銷
l 進(jìn)行圖形變換,也可以寫自己的變換類洞难,但是必須實(shí)現(xiàn)Transformation接口
l 支持設(shè)置加載之前的圖片舆吮,和加載失敗后的圖片
l 支持加載資源文件的圖片
l 支持加載sdcard中的圖片文件

Fresco

FaceBook出品
Fresco綜合了之前圖片加載庫的優(yōu)點(diǎn)的基礎(chǔ)上利用本地代碼做了性能上的優(yōu)化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市队贱,隨后出現(xiàn)的幾起案子色冀,更是在濱河造成了極大的恐慌,老刑警劉巖柱嫌,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锋恬,死亡現(xiàn)場離奇詭異,居然都是意外死亡编丘,警方通過查閱死者的電腦和手機(jī)与学,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門彤悔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人癣防,你說我怎么就攤上這事蜗巧。” “怎么了蕾盯?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵幕屹,是天一觀的道長。 經(jīng)常有香客問我级遭,道長望拖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任挫鸽,我火速辦了婚禮说敏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丢郊。我一直安慰自己盔沫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布枫匾。 她就那樣靜靜地躺著架诞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪干茉。 梳的紋絲不亂的頭發(fā)上谴忧,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音角虫,去河邊找鬼沾谓。 笑死,一個胖子當(dāng)著我的面吹牛戳鹅,可吹牛的內(nèi)容都是我干的均驶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼枫虏,長吁一口氣:“原來是場噩夢啊……” “哼辣恋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起模软,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饮潦,沒想到半個月后燃异,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡继蜡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年回俐,在試婚紗的時候發(fā)現(xiàn)自己被綠了逛腿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡仅颇,死狀恐怖单默,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忘瓦,我是刑警寧澤搁廓,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站耕皮,受9級特大地震影響境蜕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凌停,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一粱年、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罚拟,春花似錦台诗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秃励,卻和暖如春氏仗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夺鲜。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工皆尔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人币励。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓慷蠕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親食呻。 傳聞我的和親對象是個殘疾皇子流炕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 在編寫Android程序的時候經(jīng)常要用到許多圖片,不同圖片總是會有不同的形狀仅胞、不同的大小每辟,但在大多數(shù)情況下,這些圖...
    讀行游閱讀 1,285評論 2 12
  • 【Android 庫 Glide】 引用 Android圖片加載框架最全解析(一)干旧,Glide的基本用法Andro...
    Rtia閱讀 5,444評論 0 22
  • 7.1 壓縮圖片 一渠欺、基礎(chǔ)知識 1、圖片的格式 jpg:最常見的圖片格式椎眯。色彩還原度比較好挠将,可以支持適當(dāng)壓縮后保持...
    AndroidMaster閱讀 2,519評論 0 13
  • 2021期待與你一起共事胳岂,點(diǎn)擊查看崗位[http://www.reibang.com/p/6f4d67fa406...
    閑庭閱讀 16,638評論 0 75
  • 圖片顯示 我們需要根據(jù)需求去加載圖片的大小。 例如在列表中僅用于預(yù)覽時加載縮略圖舔稀。 只有當(dāng)用戶點(diǎn)擊具體條目想看詳細(xì)...
    CarlosLynn閱讀 552評論 0 0