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();
}
}
});
}
版权声明:本文为weixin_41722852原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。