- 這兩天在做網絡請求的緩存,我用的是retrofit2.1.0
- retrofit 實現緩存,其實質是okhttp實現網絡緩存。
- 但是在這個工程中,遇到了一個問題 返回錯誤碼 504,緩存數據沒有讀出來。
先說重點:
原因其實原因很簡單:我的url中有個公共參數,
我的url是這樣的
https://tc****.h****.cn/get_carousel_list?versionName=1.6.3&clientType=Nexus6_android_&
net=wifi&user_id=8d16a137d5cc, tag=null發現了嗎?我的公共參數中有
net
這個值,
當我聯網緩存的時候是net
的值是wifi
,3G
,LTE
,
當我斷網的時候net
的值是disconnection
這就是我緩存失敗的原因。
因爲我們所有的數據是對url
進行了MD5
後,作爲文件名,
包數據寫對應的文件中。當我們網絡狀態改變的時候,
我們得到的MD5
的值更本不是同一個,
所以,我們更本無法拿到我們正確的緩存文件。
結論:
504
錯誤歸根究竟是緩存沒有找到。
沒找到的原因是緩存對應的url
改變了,
錯使MD5
後文件名改變,因此沒有找到url
對應的緩存。
解決辦法:
方法1、和服務端協商,將url
中的公共參數,例如net
的狀態放在header
中。
方法2、去掉net這個參數,是url保持固定,不要變動。
方法3、還沒想的,只要能讓人你的url保持不變的方法都可行。
一點總結:
其實緩存的實現方法,網上油無數的博客都做了詳細的說明。
這裏不做闡述。
出了問題,我爲解決這個問題,翻遍了網上的所有博客,
以爲是緩存使用的不對,還懷疑是自己的攔截器不對,
懷疑的問題很對。可是似乎就我這裏有問題,
博客上沒有任何闡述相關問題。大家視乎用的都很順利。
其實這個問題也不難想到,只是自己當時面對整個未知的框架,
未知的緩存,最重要的是覺得未知的太多。
所以沒有深入的去思考這個問題。
其實我們遇到問題時候,應該靜心去思考問題。
分析問題,這樣我們才能成長,才能進步。
我這次就花費了不少時間,問題在於我沒有好好靜心分析這些問題。
希望大家也引以爲戒。