版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21727627/article/details/79033339
其实就是对网络请求RequestBody进行来代理.
使用:
public void upload(View view) {
File externalStorageDirectory = new File(Environment.getExternalStorageDirectory
().getAbsoluteFile(), "nihao.apk");
Log.e(TAG, "upload: " + externalStorageDirectory.toString());
RequestBody requestBody = RequestBody.create(MediaType.parse
("application/octet-stream"), externalStorageDirectory);
ProxyRequestBody proxyRequestBody = new ProxyRequestBody(requestBody, new
ProxyRequestBody.UploadListener() {
@Override
public void onUpload(double progress) {
Log.e(TAG, "onUpload: " + progress);
}
});
MultipartBody body = new MultipartBody.Builder()
.addFormDataPart("file", "bug.docx", proxyRequestBody) //这里要传递代理对象
.build();
Request request = new Request.Builder().url(BASEURL + "upload")
.post(body).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure: " + call.toString());
Log.e(TAG, "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.e(TAG, "onResponse: " + response.body().string());
}
});
}
执行客户端结果:
已经成功监听.服务端:
只是稍微处理一下
代理类:
public class ProxyRequestBody extends RequestBody {
private RequestBody mRequestBody;
private UploadListener mUploadListener;
public ProxyRequestBody(RequestBody mRequestBody, UploadListener mUploadListener) {
this.mRequestBody = mRequestBody;
this.mUploadListener = mUploadListener;
}
@Override
public long contentLength() throws IOException {
return mRequestBody.contentLength();
}
@Nullable
@Override
public MediaType contentType() {
return mRequestBody.contentType();
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
CountBufferedSink countBufferedSink=new CountBufferedSink(sink);
BufferedSink sink1= Okio.buffer(countBufferedSink);
mRequestBody.writeTo(sink1);
sink1.flush();
}
public interface UploadListener{
void onUpload(double progress);
}
class CountBufferedSink extends ForwardingSink{
private double writeCount=0;
public CountBufferedSink(Sink delegate) {
super(delegate);
}
@Override
public void write(Buffer source, long byteCount) throws IOException {
super.write(source, byteCount);
writeCount+=byteCount;
mUploadListener.onUpload( writeCount*100/contentLength());
}
}
}
只是在writeTo() 稍微处理一下就行了,其他就代理一下ok.
原理图:
ps:代码是抄hy的,为的是记录其原理(我只是一只小菜鸟)