OKHTTP 3 Seguimiento del progreso de subida de varias partes

¿Cómo puedo seguir el progreso de la subida en OkHttp 3 Puedo encontrar respuestas para v2 pero no v3, como esto

Una muestra de solicitud de varias partes de recetas de OkHttp

private static final String IMGUR_CLIENT_ID = "..."; private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); private final OkHttpClient client = new OkHttpClient(); public void run() throws Exception { // Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("title", "Square Logo") .addFormDataPart("image", "logo-square.png", RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png"))) .build(); Request request = new Request.Builder() .header("Authorization", "Client-ID " + IMGUR_CLIENT_ID) .url("https://api.imgur.com/3/image") .post(requestBody) .build(); Response response = client.newCall(request).execute(); if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); System.out.println(response.body().string()); } 

Envuelva su RequestBody MultiPart en este RequestBody con instancia de Listener y Voila!

 public class ProgressRequestBody extends RequestBody { protected RequestBody mDelegate; protected Listener mListener; protected CountingSink mCountingSink; public ProgressRequestBody(RequestBody delegate, Listener listener) { mDelegate = delegate; mListener = listener; } @Override public MediaType contentType() { return mDelegate.contentType(); } @Override public long contentLength() { try { return mDelegate.contentLength(); } catch (IOException e) { e.printStackTrace(); } return -1; } @Override public void writeTo(BufferedSink sink) throws IOException { mCountingSink = new CountingSink(sink); BufferedSink bufferedSink = Okio.buffer(mCountingSink); mDelegate.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; mListener.onProgress((int) (100F * bytesWritten / contentLength())); } } public interface Listener { void onProgress(int progress); } } 

Según la respuesta de Sourabh, quiero decirle a ese campo de CountingSink

 private long bytesWritten = 0; 

Debe moverse a la clase ProgressRequestBody

  • La llamada a la API de Retrofit recibe "HTTP FAILED: java.io.IOException: Cancelled"
  • Subida de imagen usando okHttp
  • Android Retrofi 2, las diferencias entre addInterceptor y addNetworkInterceptor para editar las respuestas
  • MissingResourceException: No se puede encontrar el paquete para el nombre base sun.util.logging.resources.logging, locale en_US
  • Okhttp ignora la configuración de Dispatcher cuando se usa con Retrofit RxJavaCallAdapterFactory
  • Enlace SSL mediante Google Volley
  • ¿Cómo establezco el tiempo de espera para OkHttpClient?
  • ¿Cómo obtener la URL redireccionada de OkHttp3?
  • React Native & okhttp en Android - Establecer User-Agent
  • ¿Por qué los métodos asíncronos llaman antes en Retrofit 2?
  • Añadir cookie a la solicitud del cliente OkHttp
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.