上文,我们通过自己编写的okhttp框架,实现了下载功能,这节,我们在此基础上,一起来实现断点下载功能。
1. 需求及思考
需求:文件下载中途由于一些原因,停止下载,在异常原因(网络中断、暂停下载)解除之后,继续下载文件,可以接着目前的进度下载,而不是重新下载。
思考:需求似乎很简单,但是仔细分解,发现有以下问题需要去解决:
- 文件的存储,我们需要根据每个url的不同,生成文件名去存储文件,下载了多少数据,就存储多少
- 在下次请求时,需要看是否已有文件,如果有,则需要根据当前已下载的长度,然后从这个长度开始请求,这个如何实现?
- url需要与缓存机制挂钩,如果文件已下载成功,那么直接返回
- 既然有恢复下载,那么必然涉及到下载状态的保存
- 我们知道下载任务是一个线程,然后放入线程池执行的,那么如何停止任务?
- 文件的追加写入功能,如何实现?
问题的话,暂时只想到这么多,我们先基于这些问题,去思考一下,可以使用我们已有的哪些知识,组合成为框架,去解决这些问题?
2.具体实现
2.1 文件独立保存功能
上一节课,我们为了简单,下载的文件,都是统一的命名