图片显示不完整
記錄一個(gè)bug
最近遇到一個(gè)非常難搞的問題,花了蠻長的時(shí)間才算解決了,這里記錄一下自己的解決過程!
圖片顯示一半
我們的APP里面偶爾出現(xiàn)圖片只加載了一部分的問題,但是其他用戶顯示是正常的,也不算必現(xiàn),就是偶爾聽用戶報(bào)一下,之前也沒有太過關(guān)注這個(gè)bug了,沒有及時(shí)去處理,作為了一個(gè)遺留問題,延后解決!
隨著時(shí)間的流逝,突然一個(gè)大boss直接將這個(gè)bug反饋到我們研發(fā),而且還是比較重要的圖片,需要我們馬上去處理,之前的債也得補(bǔ)上了!
解決過程
猜想
首先根據(jù)我們項(xiàng)目,做了幾點(diǎn)思考:
圖片是加密的,加密方式是AES的,有個(gè)別人只看到圖片的一部分,說明:
1.圖片的上行是沒有問題的
2.可能是下行
3.解密出現(xiàn)問題
驗(yàn)證猜想
1.因?yàn)槠渌丝梢哉2榭?#xff0c;說明圖片上傳OK
2.確保圖片下載是OK的
3.確保解密是否正常
我們將解密的圖片直接保存到SD卡,然后用相冊(cè)查看,發(fā)現(xiàn)是正常的,說明解密也是OK的繼續(xù)猜想
前面的步驟的確認(rèn)沒有問題,那就只有最后一步了,顯示框架的問題!
我們的圖片顯示使用的是Glide,直接將解密后的文件流傳遞給Glide,這就比較難搞了,如果是Glide的問題那就真的不太好解決了,接下來的時(shí)間就比較茫然和懵逼了,不知道怎么去定位問題了!難道是傳遞給Glide的流可能有問題,或者流沒有關(guān)閉。。。。
驗(yàn)證
將正常顯示的圖片傳遞給Glide的inputStream比對(duì)錯(cuò)誤的流,發(fā)現(xiàn)流的大小是一樣的,各種檢查代碼也沒有什么卵用。。。。
猜想
突然一天中午起床,腦子像開了掛一樣,發(fā)現(xiàn)了一個(gè)驚天秘密,顯示圖片的邏輯如下:
if(!FileUtils.isFileExist(path)){//文件不存在,去下載 }else {//文件存在,Glide顯示 }那如果點(diǎn)擊預(yù)覽之后,首先圖片不存在,網(wǎng)絡(luò)加載,退出預(yù)覽界面,再次進(jìn)入,那么此時(shí)文件已經(jīng)下載了一部分了,肯定就走else的邏輯,直接顯示圖片,我們之前有個(gè)結(jié)論:
如果圖片不完整,AES應(yīng)該是解密不出來的那么這個(gè)時(shí)候圖片應(yīng)該不能顯示,而不是只顯示一部分,和結(jié)論矛盾了
驗(yàn)證
抱著試一試的態(tài)度,去重現(xiàn)這個(gè)場景,點(diǎn)擊預(yù)覽,網(wǎng)絡(luò)下載圖片,然后退出,再次預(yù)覽,發(fā)現(xiàn)必現(xiàn)該bug,那么說明這個(gè)結(jié)論是錯(cuò)誤的:
如果文件不完整,AES也能部分解密這樣的話,這個(gè)bug就能解釋的通了:
文件沒有完全下載,解密只解了一部分,交給Glide也就只顯示了一部分我們又對(duì)圖片做了磁盤緩存:
Glide.diskCacheStrategy(DiskCacheStrategy.RESULT).into(imageview);這次不完整的圖片就被Glide緩存了起來,以后每次預(yù)覽都只顯示這個(gè)緩存圖片,沒有機(jī)會(huì)去加載完整的圖片,也就是后面就算每次傳遞給Glide的流是完整的,有沒有去加載這個(gè)流的數(shù)據(jù)!
為了驗(yàn)證是Glide使用了磁盤緩存里面的圖片,我直接將Glide的磁盤緩存清理掉:
Glide.get(ApplicationExt.mContext.getApplicationContext()).clearDiskCache();果然圖片正常顯示了出來!知道bug出生的原因了,修改也就簡單了
完善
1.確保文件完整
上傳,下載都加上MD5驗(yàn)證,確保文件本身是沒有問題2.預(yù)覽的判斷
md5一致,并且文件存在才去預(yù)覽總結(jié)
- 上一篇: 【数据可视化】第五章—— 基于PyEch
- 下一篇: “动真格”的垃圾分类,需要你我容忍其中的