android 断点续传 okhttp
时间: 2023-05-23 16:01:48 浏览: 103
框架提供了一个Interceptor--ProgressInterceptor,可以实现断点续传的功能。在该Interceptor的拦截器中,我们可以通过添加Range请求头来告诉服务器续传的起始位置,同时将服务端返回的数据写入到断点下载文件的指定位置即可。以下是示例代码:
```
public class ProgressInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
return response.newBuilder()
.body(new ProgressResponseBody(response.body()))
.build();
}
private static class ProgressResponseBody extends ResponseBody {
private final ResponseBody responseBody;
private BufferedSource bufferedSource;
public ProgressResponseBody(ResponseBody responseBody) {
this.responseBody = responseBody;
}
@Override
public MediaType contentType() {
return responseBody.contentType();
}
@Override
public long contentLength() {
return responseBody.contentLength();
}
@Override
public BufferedSource source() {
if (bufferedSource == null) {
bufferedSource = Okio.buffer(source(responseBody.source()));
}
return bufferedSource;
}
private Source source(Source source) {
return new ForwardingSource(source) {
long totalBytesRead = 0L;
@Override
public long read(Buffer sink, long byteCount) throws IOException {
long bytesRead = super.read(sink, byteCount);
totalBytesRead += bytesRead != -1 ? bytesRead : 0;
return bytesRead;
}
};
}
}
}
```
在调用OkHttpClient的Builder方法时添加一个ProgressInterceptor拦截器即可。