package com.doumee.lib_coremodel.http.interceptor; import java.io.IOException; import okhttp3.MediaType; import okhttp3.ResponseBody; import okio.Buffer; import okio.BufferedSource; import okio.ForwardingSource; import okio.Okio; import okio.Source; /** * Created by goldze on 2017/5/11. */ public class ProgressResponseBody extends ResponseBody { private ResponseBody responseBody; private BufferedSource bufferedSource; private String tag; public ProgressResponseBody(ResponseBody responseBody) { this.responseBody = responseBody; } public ProgressResponseBody(ResponseBody responseBody, String tag) { this.responseBody = responseBody; this.tag = tag; } @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 bytesReaded = 0; @Override public long read(Buffer sink, long byteCount) throws IOException { long bytesRead = super.read(sink, byteCount); bytesReaded += bytesRead == -1 ? 0 : bytesRead; //使用RxBus的方式,实时发送当前已读取(上传/下载)的字节数据 //TODO 实时发送当前已读取(上传/下载)的字节数据 //RxBus.getDefault().post(new DownLoadStateBean(contentLength(), bytesReaded, tag)); return bytesRead; } }; } }