Glide對Problem decoding into existing bitmap異常的處理

按照預期, glide對任何bitmap的使用, 都需要經由LruBitmapPool生成.
但是最近在調試代碼的時候, 也發(fā)現(xiàn)了一些異常的現(xiàn)象:
明明bitmapPool借出bitmap對象的時候, 尺寸大小是a, 但是后面歸還給bitmapPool的對象尺寸卻出現(xiàn)了b大小.
這很讓人費解.

調試了一晚上, 才發(fā)現(xiàn), 由于有些圖片本身格式有問題, 比如不完整. 會導致在Downsampler.java中的decodeStream()中出現(xiàn)異常.

private static Bitmap decodeStream(InputStream is, BitmapFactory.Options options,
      DecodeCallbacks callbacks, BitmapPool bitmapPool) throws IOException {
    if (options.inJustDecodeBounds) {
      is.mark(MARK_POSITION);
    } else {
      // Once we've read the image header, we no longer need to allow the buffer to expand in
      // size. To avoid unnecessary allocations reading image data, we fix the mark limit so that it
      // is no larger than our current buffer size here. We need to do so immediately before
      // decoding the full image to avoid having our mark limit overridden by other calls to
      // mark and reset. See issue #225.
      callbacks.onObtainBounds();
    }
    // BitmapFactory.Options out* variables are reset by most calls to decodeStream, successful or
    // otherwise, so capture here in case we log below.
    int sourceWidth = options.outWidth;
    int sourceHeight = options.outHeight;
    String outMimeType = options.outMimeType;
    final Bitmap result;
    TransformationUtils.getBitmapDrawableLock().lock();
    try {
      result = BitmapFactory.decodeStream(is, null, options);
    } catch (IllegalArgumentException e) {
      IOException bitmapAssertionException =
          newIoExceptionForInBitmapAssertion(e, sourceWidth, sourceHeight, outMimeType, options);
      if (Log.isLoggable(TAG, Log.DEBUG)) {
        Log.d(TAG, "Failed to decode with inBitmap, trying again without Bitmap re-use",
            bitmapAssertionException);
      }
      if (options.inBitmap != null) {
        try {
          is.reset();
          bitmapPool.put(options.inBitmap);
          options.inBitmap = null;
          return decodeStream(is, options, callbacks, bitmapPool);
        } catch (IOException resetException) {
          throw bitmapAssertionException;
        }
      }
      throw bitmapAssertionException;
    } finally {
      TransformationUtils.getBitmapDrawableLock().unlock();
    }

    if (options.inJustDecodeBounds) {
      is.reset();

    }
    return result;
  }

注意上面的那個catch()分支, 如果進入之后, 會把之前從bitmapPool中借出的bitmap對象( options.inBitmap) 歸還. 然后繼續(xù)重新加載圖片, 這是這次加載, 就是純新建的bitmap了, 不是bitmapPool中的對象了.

而后續(xù)的流程, 并不知曉這個情況, 導致會在某個節(jié)點, 仍然把此處新生成的bitmap對象, 歸還給bitmapPool.
于是就出現(xiàn)了開頭所說的現(xiàn)象.
這里列出具體的exception:
07-10 21:07:33.987 8694-9208/com.sogou.luedong E/Downsampler: decodeStream:
java.lang.IllegalArgumentException: Problem decoding into existing bitmap

從網(wǎng)上查, 也能查到很多關于這個報錯的問題:
https://stackoverflow.com/questions/16034756/why-does-decoding-bitmap-with-inbitmap-always-get-java-lang-illegalargumentexcep
https://github.com/facebook/fresco/issues/1204

想了想, 也并沒有什么更好的辦法解決, 對于出現(xiàn)異常之后的這種流程, 既然bitmap已經新生成了, 放入bitmapPool是最好的選擇. 因為后續(xù)保不齊就真的能用到.

也許只能從后臺數(shù)據(jù)上下功夫, 去除此類圖片. 多半是由于抓取時有問題, 沒有抓取完整.

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末臣疑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡罢低,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門胖笛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來网持,“玉大人,你說我怎么就攤上這事长踊」σǎ” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵身弊,是天一觀的道長辟汰。 經常有香客問我,道長阱佛,這世上最難降的妖魔是什么帖汞? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮凑术,結果婚禮上翩蘸,老公的妹妹穿的比我還像新娘。我一直安慰自己淮逊,他們只是感情好催首,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泄鹏,像睡著了一般郎任。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上命满,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天涝滴,我揣著相機與錄音,去河邊找鬼胶台。 笑死,一個胖子當著我的面吹牛杂抽,可吹牛的內容都是我干的诈唬。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼缩麸,長吁一口氣:“原來是場噩夢啊……” “哼铸磅!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤阅仔,失蹤者是張志新(化名)和其女友劉穎吹散,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體八酒,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡空民,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了羞迷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片界轩。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖衔瓮,靈堂內的尸體忽然破棺而出浊猾,到底是詐尸還是另有隱情,我是刑警寧澤热鞍,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布葫慎,位于F島的核電站,受9級特大地震影響薇宠,放射性物質發(fā)生泄漏幅疼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一昼接、第九天 我趴在偏房一處隱蔽的房頂上張望爽篷。 院中可真熱鬧,春花似錦慢睡、人聲如沸逐工。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泪喊。三九已至,卻和暖如春髓涯,著一層夾襖步出監(jiān)牢的瞬間袒啼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工纬纪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚓再,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓包各,卻偏偏與公主長得像摘仅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子问畅,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容