下文中所用到的依赖:implementation 'com.squareup.retrofit2:retrofit:2.1.0',虽然用的retrofit的包,但是只用了里面的okhttp部分,因为是demo项目,原先就已经加了依赖了,不方便换了。
现在我们开始多线程分段下载一个大文件,用的是服务上一个apk文件(23M,假设是大文件)
开工,ps:网络权限,文件读写权限,别忘了
1. 既然是多线程下载,先建立一个线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
2. 确认下载文件的大小
OkHttpClient client = createOkHttpClient();
final Request request = new Request.Builder()
.url(url)
.head()//这里注意请求方式为head
.build();
try {
Response response = client.newCall(request).execute();
httpResponseCall.onResponseSuccess(response);
} catch (IOException e) {
e.printStackTrace();
}
因为本身是线程调用的,这里网络请求就用同步了,request请求方式为head,只要获取文件大小就好了,然后在请求返回的head中获取文件大小
long length = Long.parseLong(response.header("content-length"));//获取文件长度
long count = length / M + 1;//下载次数 M = 1024 * 1024 * 5,M为一次下载多少长度,这里为5mb
for (int i = 0; i < count; i++) {
long start, end;//每次一次下载的初始位置和结束位置
if (i == count - 1) {
end = length - 1;//因为从0开始的,所以要-1,比如10个字节,就是0-9
} else {
end = (i + 1) * M - 1;