轉(zhuǎn)載
馬云飛 的博客地址:
http://blog.csdn.net/sw950729
正文
話不多說。這次我主要介紹下okhttp如何實現(xiàn)多文件斷點下載。參考文章:
http://blog.csdn.net/KevinsCSDN/article/details/51934274
首先,在這邊闡述下我做的過程中所遇到的問題:
如何存儲url對應的當前長度以及總長度
如何實現(xiàn)暫停以及續(xù)傳操作
如何用一個info對象實現(xiàn)多文件的下載
response.body.contentlength與實際長度不一樣。(例如我獲取的長度是5.5M但他的實際長度是6.7M)
如何存儲當前長度以及總長度
我在網(wǎng)上看到很多demo對于這塊是用 **SQLite **實現(xiàn),我覺得完全可以 Shareperference 來存儲,通過 url 來存儲對應的 當前長度 和 總長度,有人回說 Shareperference 不是只能一個建對應一個值么,兩個怎么解決。我們可以 通過MD5加密的url來存儲當前進度,通過MD2加密來存儲總進度。
如何實現(xiàn)暫停以及續(xù)傳操作
我們可以通過 okhttp 自帶的攔截器來實現(xiàn)其效果,具體代碼如下:
如何用一個info對象實現(xiàn)多文件的下載
其實在前面我也說了。用 Shareperference 來實現(xiàn),具體怎么說的。你的url,存儲路徑每次都是需要傳的,但是為了防止進度沖突(例:明明的A的進度,下載B的時候卻用的A的進度)。所以通過傳入的url來用 Shareperference 得到他存儲的 當前長度 與 總長度 來解決。
response.body.contentlength 與實際長度不一樣。
其實。。。我也不知道。。百度了好久。得到的答案是在HTTP協(xié)議中,消息實體長度和消息實體的傳輸長度是有區(qū)別,比如說gzip壓縮下,消息實體長度是壓縮前的長度,消息實體的傳輸長度是gzip壓縮后的長度。還有種說法還有種說法是服務器限制問題。不解??傊畷е芦@取進度的時候,進度值是大于100的。。。
大致的問題和解決方法已經(jīng)說明了。首先,我們先來看下效果圖。
最后上源碼,相信你看懂了上面的思路。對于源碼的理解就不是很難了:
關于 httpdownloadbean:
就是這幾個數(shù)據(jù),通過 set 和 get 來設置和獲取。
ShareperferenceUtils 是關于 Shareperference 的工具類。filesupport 是用來創(chuàng)建文件的。byteutils 可以不必理會。