美文网首页
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