轉(zhuǎn)載
馬云飛 的博客地址:
http://blog.csdn.net/sw950729
正文
話不多說米愿。這次我主要介紹下okhttp如何實現(xiàn)多文件斷點下載褥伴。參考文章:
http://blog.csdn.net/KevinsCSDN/article/details/51934274
首先氮兵,在這邊闡述下我做的過程中所遇到的問題:
如何存儲url對應(yīng)的當(dāng)前長度以及總長度
如何實現(xiàn)暫停以及續(xù)傳操作
如何用一個info對象實現(xiàn)多文件的下載
response.body.contentlength與實際長度不一樣究反。(例如我獲取的長度是5.5M但他的實際長度是6.7M)
如何存儲當(dāng)前長度以及總長度
我在網(wǎng)上看到很多demo對于這塊是用 **SQLite **實現(xiàn)置逻,我覺得完全可以 Shareperference 來存儲,通過 url 來存儲對應(yīng)的 當(dāng)前長度 和 總長度涩蜘,有人回說 Shareperference 不是只能一個建對應(yīng)一個值么,兩個怎么解決熏纯。我們可以 通過MD5加密的url來存儲當(dāng)前進(jìn)度同诫,通過MD2加密來存儲總進(jìn)度。
如何實現(xiàn)暫停以及續(xù)傳操作
我們可以通過 okhttp 自帶的攔截器來實現(xiàn)其效果樟澜,具體代碼如下:
如何用一個info對象實現(xiàn)多文件的下載
其實在前面我也說了误窖。用 Shareperference 來實現(xiàn),具體怎么說的秩贰。你的url霹俺,存儲路徑每次都是需要傳的,但是為了防止進(jìn)度沖突(例:明明的A的進(jìn)度毒费,下載B的時候卻用的A的進(jìn)度)丙唧。所以通過傳入的url來用 Shareperference 得到他存儲的 當(dāng)前長度 與 總長度 來解決。
response.body.contentlength 與實際長度不一樣觅玻。
其實想际。。溪厘。我也不知道沼琉。。百度了好久桩匪。得到的答案是在HTTP協(xié)議中打瘪,消息實體長度和消息實體的傳輸長度是有區(qū)別,比如說gzip壓縮下傻昙,消息實體長度是壓縮前的長度闺骚,消息實體的傳輸長度是gzip壓縮后的長度。還有種說法還有種說法是服務(wù)器限制問題妆档。不解僻爽。總之會導(dǎo)致獲取進(jìn)度的時候贾惦,進(jìn)度值是大于100的胸梆。。须板。
大致的問題和解決方法已經(jīng)說明了碰镜。首先,我們先來看下效果圖习瑰。
最后上源碼绪颖,相信你看懂了上面的思路。對于源碼的理解就不是很難了:
關(guān)于 httpdownloadbean:
就是這幾個數(shù)據(jù)甜奄,通過 set 和 get 來設(shè)置和獲取柠横。
ShareperferenceUtils 是關(guān)于 Shareperference 的工具類窃款。filesupport 是用來創(chuàng)建文件的。byteutils 可以不必理會牍氛。