78 lines
2.3 KiB
Plaintext
Executable File
78 lines
2.3 KiB
Plaintext
Executable File
package com.cm.utils.net.body;
|
||
|
||
import com.cm.utils.net.response.ResponseHandler;
|
||
|
||
import java.io.IOException;
|
||
|
||
import okhttp3.MediaType;
|
||
import okhttp3.RequestBody;
|
||
import okio.Buffer;
|
||
import okio.BufferedSink;
|
||
import okio.ForwardingSink;
|
||
import okio.Okio;
|
||
import okio.Sink;
|
||
|
||
/**
|
||
* Created by Xuer on 2017/3/8.
|
||
* 重写request body 设置上传进度监听
|
||
*/
|
||
public class ProgressRequestBody extends RequestBody {
|
||
private ResponseHandler mResponseHandler; //回调监听
|
||
private RequestBody mRequestBody;
|
||
private BufferedSink mBufferedSink;
|
||
|
||
public ProgressRequestBody(RequestBody requestBody, ResponseHandler responseHandler) {
|
||
this.mResponseHandler = responseHandler;
|
||
this.mRequestBody = requestBody;
|
||
}
|
||
|
||
@Override
|
||
public MediaType contentType() {
|
||
return mRequestBody.contentType();
|
||
}
|
||
|
||
@Override
|
||
public long contentLength() throws IOException {
|
||
return mRequestBody.contentLength();
|
||
}
|
||
|
||
@Override
|
||
public void writeTo(BufferedSink sink) throws IOException {
|
||
if(mBufferedSink == null) {
|
||
mBufferedSink = Okio.buffer(sink(sink));
|
||
}
|
||
|
||
//写入
|
||
mRequestBody.writeTo(mBufferedSink);
|
||
//必须调用flush,否则最后一部分数据可能不会被写入
|
||
mBufferedSink.flush();
|
||
}
|
||
|
||
/**
|
||
* 写入,回调进度接口
|
||
* @param sink Sink
|
||
* @return Sink
|
||
*/
|
||
private Sink sink(Sink sink) {
|
||
return new ForwardingSink(sink) {
|
||
//当前写入字节数
|
||
long bytesWritten = 0L;
|
||
//总字节长度,避免多次调用contentLength()方法
|
||
long contentLength = 0L;
|
||
|
||
@Override
|
||
public void write(Buffer source, long byteCount) throws IOException {
|
||
super.write(source, byteCount);
|
||
if (contentLength == 0) {
|
||
//获得contentLength的值,后续不再调用
|
||
contentLength = contentLength();
|
||
}
|
||
//增加当前写入的字节数
|
||
bytesWritten += byteCount;
|
||
//回调
|
||
mResponseHandler.onProgress(bytesWritten, contentLength);
|
||
}
|
||
};
|
||
}
|
||
}
|