I am trying to implement a progress bar to indicate the progress of a multi-file file download.
I read from a comment on this answer - https://stackoverflow.com/a/4646262/2126326 that I should wrap the receiver passed to RequestBody and provide a callback that tracks the bytes moved,
I created a custom RequestBody and wrapped the receiver with the CustomSink class, however, through debugging, I see that the bytes are being written to RealBufferedSink ln 44, and the user-defined receiver recording method is run only once, not allowing me to track the moved bytes.
private class CustomRequestBody extends RequestBody { MediaType contentType; byte[] content; private CustomRequestBody(final MediaType contentType, final byte[] content) { this.contentType = contentType; this.content = content; } @Override public MediaType contentType() { return contentType; } @Override public long contentLength() { return content.length; } @Override public void writeTo(BufferedSink sink) throws IOException { CustomSink customSink = new CustomSink(sink); customSink.write(content); } } private class CustomSink implements BufferedSink { private static final String TAG = "CUSTOM_SINK"; BufferedSink bufferedSink; private CustomSink(BufferedSink bufferedSink) { this.bufferedSink = bufferedSink; } @Override public void write(Buffer source, long byteCount) throws IOException { Log.d(TAG, "source size: " + source.size() + " bytecount" + byteCount); bufferedSink.write(source, byteCount); } @Override public void flush() throws IOException { bufferedSink.flush(); } @Override public Timeout timeout() { return bufferedSink.timeout(); } @Override public void close() throws IOException { bufferedSink.close(); } @Override public Buffer buffer() { return bufferedSink.buffer(); } @Override public BufferedSink write(ByteString byteString) throws IOException { return bufferedSink.write(byteString); } @Override public BufferedSink write(byte[] source) throws IOException { return bufferedSink.write(source); } @Override public BufferedSink write(byte[] source, int offset, int byteCount) throws IOException { return bufferedSink.write(source, offset, byteCount); } @Override public long writeAll(Source source) throws IOException { return bufferedSink.writeAll(source); } @Override public BufferedSink writeUtf8(String string) throws IOException { return bufferedSink.writeUtf8(string); } @Override public BufferedSink writeString(String string, Charset charset) throws IOException { return bufferedSink.writeString(string, charset); } @Override public BufferedSink writeByte(int b) throws IOException { return bufferedSink.writeByte(b); } @Override public BufferedSink writeShort(int s) throws IOException { return bufferedSink.writeShort(s); } @Override public BufferedSink writeShortLe(int s) throws IOException { return bufferedSink.writeShortLe(s); } @Override public BufferedSink writeInt(int i) throws IOException { return bufferedSink.writeInt(i); } @Override public BufferedSink writeIntLe(int i) throws IOException { return bufferedSink.writeIntLe(i); } @Override public BufferedSink writeLong(long v) throws IOException { return bufferedSink.writeLong(v); } @Override public BufferedSink writeLongLe(long v) throws IOException { return bufferedSink.writeLongLe(v); } @Override public BufferedSink emitCompleteSegments() throws IOException { return bufferedSink.emitCompleteSegments(); } @Override public OutputStream outputStream() { return bufferedSink.outputStream(); } }
Does anyone have an example of how I will do this?
Jonathon Fry Sep 21 '14 at 18:42 2014-09-21 18:42
source share