日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图片显示不完整

發布時間:2024/1/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图片显示不完整 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

記錄一個bug

最近遇到一個非常難搞的問題,花了蠻長的時間才算解決了,這里記錄一下自己的解決過程!

圖片顯示一半

我們的APP里面偶爾出現圖片只加載了一部分的問題,但是其他用戶顯示是正常的,也不算必現,就是偶爾聽用戶報一下,之前也沒有太過關注這個bug了,沒有及時去處理,作為了一個遺留問題,延后解決!
隨著時間的流逝,突然一個大boss直接將這個bug反饋到我們研發,而且還是比較重要的圖片,需要我們馬上去處理,之前的債也得補上了!

解決過程

猜想

首先根據我們項目,做了幾點思考:
圖片是加密的,加密方式是AES的,有個別人只看到圖片的一部分,說明:

1.圖片的上行是沒有問題的

2.可能是下行
3.解密出現問題

驗證猜想

1.因為其他人可以正常查看,說明圖片上傳OK
2.確保圖片下載是OK的

我們將正常用戶的圖片和出問題的圖片進行文件大小,md5比對,發現沒有異常

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一致,并且文件存在才去預覽

總結

以上是生活随笔為你收集整理的图片显示不完整的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。