OkHttp 上传监听

版权声明:本文为博主原创文章,未经博主允许不得转载。 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的,为的是记录其原理(我只是一只小菜鸟)

猜你喜欢

转载自blog.csdn.net/qq_21727627/article/details/79033339
今日推荐