Android Bitmap Pool

在圖片使用較多的應(yīng)用中,每個(gè)圖片的展示至少要Decode一次徘意。由于圖片比較占內(nèi)存懂昂,所以內(nèi)存分配/釋放的頻率會(huì)提高。也就是由于allocation 導(dǎo)致的GC(GC_FOR_ALLOC)出現(xiàn)的頻率會(huì)很高翅楼。眾所周至GC可能會(huì)導(dǎo)致UI卡頓尉剩,所以說圖片多的應(yīng)用非常容易出現(xiàn)卡頓。

為了解決這個(gè)問題毅臊,Android中提供了Bitmap Pool的概念 (參考資料:Re-using Bitmaps)理茎。

使用Bitmap Pool的一種方式是使用inBitmap()。
話不多說管嬉,直接看代碼皂林。

Bitmap bitmapOne = BitmapFactory.decodeFile(filePathOne);
imageView.setImageBitmap(bitmapOne);
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePathTwo, options);
if (canUseInBitmap(bitmapOne, options)) { 
    //判斷是否可用inBitmap
    options.inMutable = true;
    options.inBitmap = bitmapOne;
}
options.inJustDecodeBounds = false;
Bitmap bitmapTwo = BitmapFactory.decodeFile(filePathTwo, options);
imageView.setImageBitmap(bitmapTwo);

如何判斷是否能夠設(shè)置使用inBitmap()呢?就得看官方給的限制條件:

  1. API 11-18 要求Bitmap大小完全一致, 并且inSampleSize必須是1 官方文檔
  2. API 19+ (Android 4.4及以后) 要求被重用的Bitmap所占大小要大于等于要加載的Bitmap

判斷是否能夠使用inBitMap()

public static boolean canUseInBitmap(Bitmap reuseBitmap, BitmapFactory.Options targetOptions) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // 4.4+
            int width = targetOptions.outWidth / targetOptions.inSampleSize;
            int height = targetOptions.outHeight / targetOptions.inSampleSize;
            int byteCount = width * height * getDim(reuseBitmap.getConfig());

            try {
                return byteCount <= reuseBitmap.getAllocationByteCount();
            } catch (NullPointerException e) {
                return byteCount <= reuseBitmap.getHeight() * reuseBitmap.getRowBytes();
            }
        }
        // API 18 前
        return reuseBitmap.getWidth() == targetOptions.outWidth
                && reuseBitmap.getHeight() == targetOptions.outHeight
                && targetOptions.inSampleSize == 1;
    }
    private static int getDim(Bitmap.Config config) {
        if (config == null) {
            return 4;
        }
        switch (config) {
            case ALPHA_8:
            default:
                return 1;
            case RGB_565:
            case ARGB_4444:
                return 2;
            case ARGB_8888:
                return 4;
        }
    }

注意事項(xiàng):

  1. 如果嘗試重用不可被復(fù)用Bitmap蚯撩,decode方法會(huì)返回null并拋出IllegalArgumentException础倍。
  2. 被復(fù)用的Bitmap必須要求設(shè)置為mutable,decode返回的新的bitmap也是mutable胎挎。

最后沟启,一個(gè)好消息 and 一個(gè)壞消息:

好消息:
Glide, Fresco等比較新的圖片加載庫犹菇,已經(jīng)完全支持inBitmap了德迹,一般情況下不需要手動(dòng)的配置。
壞消息:
目前我們產(chǎn)品中使用的UIL不支持inBitmap揭芍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胳搞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肌毅,老刑警劉巖筷转,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異悬而,居然都是意外死亡呜舒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門摊滔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阴绢,“玉大人,你說我怎么就攤上這事艰躺∩胂” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵腺兴,是天一觀的道長左电。 經(jīng)常有香客問我,道長页响,這世上最難降的妖魔是什么篓足? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮闰蚕,結(jié)果婚禮上栈拖,老公的妹妹穿的比我還像新娘。我一直安慰自己没陡,他們只是感情好涩哟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盼玄,像睡著了一般贴彼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上埃儿,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天器仗,我揣著相機(jī)與錄音,去河邊找鬼童番。 笑死精钮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剃斧。 我是一名探鬼主播杂拨,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼悯衬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤筋粗,失蹤者是張志新(化名)和其女友劉穎策橘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娜亿,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丽已,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了买决。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沛婴。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖督赤,靈堂內(nèi)的尸體忽然破棺而出嘁灯,到底是詐尸還是另有隱情,我是刑警寧澤躲舌,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布丑婿,位于F島的核電站,受9級(jí)特大地震影響没卸,放射性物質(zhì)發(fā)生泄漏羹奉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一约计、第九天 我趴在偏房一處隱蔽的房頂上張望诀拭。 院中可真熱鬧,春花似錦煤蚌、人聲如沸耕挨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俗孝。三九已至,卻和暖如春魄健,著一層夾襖步出監(jiān)牢的瞬間赋铝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工沽瘦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留革骨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓析恋,卻偏偏與公主長得像良哲,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子助隧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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