El progreso de la subida de OkHttp no está sincronizado con la subida real

Estoy tratando de seguir el progreso de una subida usando OkHttp. He creado un RequestBody personalizado con el siguiente cuerpo (cortesía de esta respuesta ) que escribe para hundir y publica el progreso.

 public class CountingFileRequestBody extends RequestBody { private static final String TAG = "CountingFileRequestBody"; private final ProgressListener listener; private final String key; private final MultipartBody multipartBody; protected CountingSink mCountingSink; public CountingFileRequestBody(MultipartBody multipartBody, String key, ProgressListener listener) { this.multipartBody = multipartBody; this.listener = listener; this.key = key; } @Override public long contentLength() throws IOException { return multipartBody.contentLength(); } @Override public MediaType contentType() { return multipartBody.contentType(); } @Override public void writeTo(BufferedSink sink) throws IOException { mCountingSink = new CountingSink(sink); BufferedSink bufferedSink = Okio.buffer(mCountingSink); multipartBody.writeTo(bufferedSink); bufferedSink.flush(); } public interface ProgressListener { void transferred(String key, int num); } 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 { bytesWritten += byteCount; listener.transferred(key, (int) (100F * bytesWritten / contentLength())); super.write(source, byteCount); delegate().flush(); // I have added this line to manually flush the sink } } } 

El problema aquí es, el fregadero se escribe para hundirse inmediatamente sin realmente enviar los bytes almacenados en el buffer al servidor. Lo que significa mi progreso llega al final mucho antes de la carga real.
Nota: Algunos dicen que el fregadero necesita estar enrasado en cada iteración para que los bytes sean cargados pero no funciona para mí.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.