OKHttp 数据读写进度监听分析
来源:互联网 发布:淘宝店自己可以开吗 编辑:程序博客网 时间:2024/06/07 22:15
请尊重原创,转载请注明出处 http://blog.csdn.net/mabeijianxi/article/details/77992315
大致架构图
(窃图地址: https://blog.piasy.com/2016/07/11/Understand-OkHttp/,可以先详细看看)
写入进度监听(比如上传)
可以对 RequestBody
进行装饰, writeTo()
中 对 Sink
再进行装饰,可以直接利用 ForwardingSink
,重写其 write()
, 其内即可获得每次写入的字节数,RequestBody
具体装饰如下:
public class CountingRequestBody extends RequestBody{ protected RequestBody delegate; protected Listener listener; protected CountingSink countingSink; public CountingRequestBody(RequestBody delegate, Listener listener) { this.delegate = delegate; this.listener = listener; } @Override public MediaType contentType() { return delegate.contentType(); } @Override public long contentLength() { try { return delegate.contentLength(); } catch (IOException e) { e.printStackTrace(); } return -1; } @Override public void writeTo(BufferedSink sink) throws IOException { countingSink = new CountingSink(sink); BufferedSink bufferedSink = Okio.buffer(countingSink); delegate.writeTo(bufferedSink); bufferedSink.flush(); } protected final class CountingSink extends ForwardingSink { private long bytesWritten = 0; public CountingSink(Sink delegate) { super(delegate); } @Override public void write(Buffer source, long byteCount) throws IOException { super.write(source, byteCount); bytesWritten += byteCount; listener.onRequestProgress(bytesWritten, contentLength()); } } public static interface Listener { public void onRequestProgress(long bytesWritten, long contentLength); }}
返回数据的进度监听(比如下载):
可以在这个责任链中添加一个 NetWorkInterceptor
,对返回的 ResponseBody
进行包装,在 source() 函数中对 Source
再进行一个包装,可以直接利用 ForwdingSource
,重写其 read()
函数即可,ResponseBody
具体包装如下:
private static class OkHttpProgressResponseBody extends ResponseBody { private final HttpUrl url; private final ResponseBody responseBody; private final ResponseProgressListener progressListener; private BufferedSource bufferedSource; OkHttpProgressResponseBody(HttpUrl url, ResponseBody responseBody, ResponseProgressListener progressListener) { this.url = url; this.responseBody = responseBody; this.progressListener = progressListener; } @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); long fullLength = responseBody.contentLength(); if (bytesRead == -1) { // this source is exhausted totalBytesRead = fullLength; } else { totalBytesRead += bytesRead; } progressListener.update(url, totalBytesRead, fullLength); return bytesRead; } }; } }
然后就是需要的时候添加一个 NetWorkInterceptor即可,如下:
OkHttpClient client = new OkHttpClient.Builder() .addNetworkInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = chain.proceed(request); return response.newBuilder() .body(new OkHttpProgressResponseBody(request.url(), response.body(), progressListener)) .build(); } }).build();
progressListener
接口自己定义一个即可。
总结
通过添加 Interceptor 的方式可以简洁对请求数据或者响应数据进行装饰。
阅读全文
1 0
- OKHttp 数据读写进度监听分析
- OKHttp上传图片实现,进度监听
- OKHttp附件下载实现,进度监听
- Android OkHttp文件上传与下载的进度监听扩展
- OkHttp资料推荐 和 下载进度监听开源
- Android OkHttp文件上传与下载的进度监听扩展
- Android OkHttp文件上传与下载的进度监听扩展
- 使用OkHttp实现下载的进度监听和断点续传
- Android OkHttp文件上传与下载的进度监听扩展
- 【封装】使用okHttp发送网络请求及上传下载进度监听
- 一行代码实现Okhttp,Retrofit,Glide下载上传进度监听
- 一行代码实现Okhttp,Retrofit,Glide下载上传进度监听
- Android OkHttp文件上传与下载的进度监听扩展
- 一行代码实现Okhttp,Retrofit,Glide下载上传进度监听
- OkHttp 使用 get post UI线程回调 上传 下载 进度监听 更好地封装
- OkHttp实现文件上传进度
- OkHttp获取request请求进度
- 【python数据分析】CSV文件数据读写
- Java设计模式之备忘录模式
- 如何在SpringMVC中使用REST风格的url
- PGM图片的一些知识
- MIX2 适配看这一篇就够了,18:9 只需一行代码
- eclipse启动项目报内存溢出
- OKHttp 数据读写进度监听分析
- Redis大部分相关
- NSURLComponents 使用简介
- 批量修改myeclipse项目中已有的htm文件的编码格式
- java反编译工具JD-GUI资源
- 1、redis配置文件参数
- Python数据挖掘学习02--numpy和pandas模块基本使用
- Ubuntu安装JDK详解
- Android逆向系列之动态调试8–IDA调试so文件(下)