作者简介 原创微信公众号郭霖 WeChat ID: guolin_blog
终于又到周五了,漫长的一周即将结束,提前祝大家周末愉快!
本篇是马云飞第三篇投稿,分享了他是如何使用OkHttp实现多文件断点下载的,希望能够帮助到大家。
马云飞的博客地址:
http://blog.csdn.net/sw950729
正文
话不多说。这次我主要介绍下okhttp如何实现多文件断点下载。参考文章:
http://blog.csdn.net/KevinsCSDN/article/details/51934274
首先,在这边阐述下我做的过程中所遇到的问题:
如何存储url对应的当前长度以及总长度
如何实现暂停以及续传操作
如何用一个info对象实现多文件的下载
response.body.contentlength与实际长度不一样。(例如我获取的长度是5.5M但他的实际长度是6.7M)
如何存储当前长度以及总长度
我在网上看到很多demo对于这块是用SQLite实现,我觉得完全可以Shareperference来存储,通过 url 来存储对应的当前长度和总长度,有人回说 Shareperference 不是只能一个建对应一个值么,两个怎么解决。我们可以通过MD5加密的url来存储当前进度,通过MD2加密来存储总进度。
如何实现暂停以及续传操作
我们可以通过 okhttp 自带的拦截器来实现其效果,具体代码如下:
如何用一个info对象实现多文件的下载
其实在前面我也说了。用 Shareperference 来实现,具体怎么说的。你的url,存储路径每次都是需要传的,但是为了防止进度冲突(例:明明的A的进度,下载B的时候却用的A的进度)。所以通过传入的url来用 Shareperference 得到他存储的 当前长度 与 总长度 来解决。
response.body.contentlength 与实际长度不一样。
其实。。。我也不知道。。百度了好久。得到的答案是在HTTP协议中,消息实体长度和消息实体的传输长度是有区别,比如说gzip压缩下,消息实体长度是压缩前的长度,消息实体的传输长度是gzip压缩后的长度。还有种说法还有种说法是服务器限制问题。不解。总之会导致获取进度的时候,进度值是大于100的。。。
大致的问题和解决方法已经说明了。首先,我们先来看下效果图。
最后上源码,相信你看懂了上面的思路。对于源码的理解就不是很难了:
关于 httpdownloadbean:
就是这几个数据,通过 set 和 get 来设置和获取。
ShareperferenceUtils 是关于 Shareperference 的工具类。filesupport 是用来创建文件的。byteutils 可以不必理会。
完。。。。。。。。。。。。。。。。。。。。。
文章原创作者GuoLin 书籍推荐
郭林大神原创android 书籍:《第一行代码 android》
淘宝链接: https://s.click.taobao.com/t?e=m%3D2%26s%3DgKUfuKdAZKocQipKwQzePOeEDrYVVa64K7Vc7tFgwiHjf2vlNIV67p2n%2BQBNMyE6Rku8%2Bpj6eJall3bs%2B3NRhNHnsKI%2BqxhyM0iVZhTFBom4YIorMPnmg8G0g2OJi%2FzmXHfenomYtn5EW9vzeG8LzfPUwktUBEmkxg5p7bh%2BFbQ%3D&pvid=10_106.6.161.154_3367_1490163222155