android okhttp 断点续传,OkHttp实现断点续传

分段下载

Range 请求头格式:Range: bytes=start-end

注:这个表示[start,end],即是包含请求头的start及end字节的。所以,下一个请求的Range,应该是上一个请求的[end+1, nextEnd]。

断点续传

// 导入OkHttp依赖

implementation("com.squareup.okhttp3:okhttp:3.12.3")

// 添加网络请求及SD卡读写权限

/**

* 使用OkHttp下载文件,支持断点续传

*/

public void downloadByOkHttp() throws IOException {

// 文件下载地址

String url = "https://alissl.ucdl.pp.uc.cn/fs08/2019/07/05/1/110_17e4089aa3a4b819b08069681a9de74b.apk";

// 创建下载文件对象

File directory = Environment.getExternalStorageDirectory();

File file = new File(directory, "20190715.apk");

RandomAccessFile accessFile = new RandomAccessFile(file, "rw");

// 断点续传:重新开始下载的位置:file.length()

String range = String.format(Locale.CHINESE, "bytes=%d-", file.length());

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()

.url(url)

.header("range", range)

.build();

// 使用OkHttp请求服务器

Call call = client.newCall(request);

Response response = call.execute();

// 连接服务器成功

ResponseBody body = response.body();

System.out.println("文件大小:" + body.contentLength());

// 移动文件指针到断点续传的位置

accessFile.seek(file.length());

// 开始断点续传

InputStream inputStream = body.byteStream();

byte[] bytes = new byte[1024];

int len = inputStream.read(bytes);

while (len != -1) {

accessFile.write(bytes, 0, len);

System.out.println("已下载字节:" + file.length());

len = inputStream.read(bytes);

}

System.out.println("文件下载完毕:" + accessFile.getFilePointer());

}

// 指定时间后自动停止下载

public void cancelDelay(final Call call, long delayMillis) {

Handler handler = new Handler(Looper.getMainLooper());

handler.postDelayed(new Runnable() {

@Override

public void run() {

call.cancel();

}

}, delayMillis);

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值