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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图片显示不完整

發(fā)布時(shí)間:2024/1/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图片显示不完整 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

記錄一個(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的

我們將正常用戶的圖片和出問題的圖片進(jìn)行文件大小,md5比對(duì),發(fā)現(xiàn)沒有異常

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é)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。