美文网首页
OkHttp实现断点续传

OkHttp实现断点续传

作者: 好学人 | 来源:发表于2019-07-15 23:14 被阅读0次

分段下载

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

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

断点续传

// 导入OkHttp依赖
implementation("com.squareup.okhttp3:okhttp:3.12.3")
// 添加网络请求及SD卡读写权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
/**
 * 使用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);
}

相关文章

网友评论

      本文标题:OkHttp实现断点续传

      本文链接:https://www.haomeiwen.com/subject/ucrakctx.html