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