package com.huxq17.example.http.request; import com.andbase.tractor.task.Task; 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; /** * Decorates an OkHttp request body to count the number of bytes written when writing it. Can * decorate any request body, but is most useful for tracking the upload progress of large * multipart requests. * * @author Leo Nikkil */ public class CountingRequestBody extends RequestBody { protected RequestBody delegate; protected Task mTask; private int mProcess = -1; protected CountingSink countingSink; public CountingRequestBody(RequestBody delegate, Task task) { this.delegate = delegate; this.mTask = task; } @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 { BufferedSink bufferedSink; countingSink = new CountingSink(sink); 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; int process = (int) (1.0 * bytesWritten / contentLength() * 100); if (mTask != null&&process!=mProcess) { mTask.notifyLoading(process); mProcess = process; } if (process == 100) { mTask = null; } } } }