1.Range简介

The Range 是一个请求首部,告知服务器返回文件的哪一部分。在一个 Range 首部中,可以一次性请求多个部分,服务器会以 multipart 文件的形式将其返回。如果服务器返回的是范围响应,需要使用 206 Partial Content 状态码。假如所请求的范围不合法,那么服务器会返回 416 Range Not Satisfiable 状态码,表示客户端错误。服务器允许忽略 Range 首部,从而返回整个文件,状态码用 200 。

添加该请求头后即可指定一个文件的范围去请求一部分的文件数据

2.andorid retrofit如何使用

2.1 设置接口

@Streaming:用于下载大文件
使用ResponseBody接收

	@Streaming
    @GET
    Observable<ResponseBody> downlogeApks(@Header("Range") String range,@Url String url);

2.2 发起请求

使用bytes=xxx-xxx来指明请求的范围
使用RandomAccessFile来写入文件

public void downlogeApk(Activity activity,Long nowlong,Long alllong) {
        RetrofitInterface retrofitInterface = RetrofitUtil.getInstance().creatShow(RetrofitInterface.class);
        Observable<ResponseBody> requestBodyObservable = retrofitInterface.downlogeApks("bytes="+nowlong+"-"+alllong,"http://dldir1.qq.com/weixin/android/weixin703android1400.apk");
        requestBodyObservable.subscribeOn(Schedulers.io()).subscribe(new Observer<ResponseBody>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                Log.d("=================", e.getMessage());
            }

            @Override
            public void onNext(ResponseBody requestBody) {
                try {
                    long contentLength = requestBody.contentLength();
                    File file = new File(Application.getContext().getExternalFilesDir(null), "wx.apk");
                    RandomAccessFile rw = new RandomAccessFile(file, "rw");
                    rw.seek(nowlong);
                    InputStream inputStream = requestBody.byteStream();
                    int hasReads = 0;
                    long readLenght = 0;
                    byte[] bytes = new byte[1024 * 10];
                    while ((hasReads = inputStream.read(bytes)) > 0) {
                        rw.write(bytes, 0, hasReads);
                        readLenght += hasReads;
                        int l = (int) (readLenght * 100 / contentLength);
                        LogUtil.d(l + "%" + "----" + readLenght + "---" + contentLength);
                    }
                    inputStream.close();
                    rw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        });
    }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐