Android Retrofit – onProgressUpdate para mostrar la notificación de progreso

Actualmente estoy usando Retrofit by Square para las comunicaciones de red de Android. ¿Hay alguna manera de obtener su progreso durante una tarea para crear una notificación de progreso, algo similar a lo que usa Facebook al cargar una imagen?

El uso de Case sería cargar una imagen con la esperanza de obtener una calidad de imagen completa sin compresión ni escalado.

Veo cómo es posible con una asynctask pero eso vencería el propósito de usar Retrofit. Sin embargo, esa podría ser la ruta que debería tomar.

Esta respuesta es para Retrofit 1. Para la solución compatible con Retrofit 2, vea esta respuesta .


Tuve el mismo problema y finalmente logré hacerlo. Estaba usando lib de spring antes y lo que muestro debajo funcionaba para Spring pero era inconsistente ya que cometí un error al usarlo para InputStream. Moví todas mis API para usar la actualización y la carga fue la última en la lista, simplemente anulé TypedFile writeTo () para actualizarme en los bytes leídos a OutputStream. Tal vez esto se puede mejorar, pero como dije, lo hice cuando estaba usando Spring, así que lo reutilicé. Este es el código para cargar y me funciona en mi aplicación. Si desea descargar comentarios, puede usar @Streaming y leer InputStream.

ProgressListener

public interface ProgressListener { void transferred(long num); } 

CountingTypedFile

 public class CountingTypedFile extends TypedFile { private static final int BUFFER_SIZE = 4096; private final ProgressListener listener; public CountingTypedFile(String mimeType, File file, ProgressListener listener) { super(mimeType, file); this.listener = listener; } @Override public void writeTo(OutputStream out) throws IOException { byte[] buffer = new byte[BUFFER_SIZE]; FileInputStream in = new FileInputStream(super.file()); long total = 0; try { int read; while ((read = in.read(buffer)) != -1) { total += read; this.listener.transferred(total); out.write(buffer, 0, read); } } finally { in.close(); } } } 

MyApiService

 public interface MyApiService { @Multipart @POST("/files") ApiResult uploadFile(@Part("file") TypedFile resource, @Query("path") String path); } 

SendFileTask

 private class SendFileTask extends AsyncTask { private ProgressListener listener; private String filePath; private FileType fileType; public SendFileTask(String filePath, FileType fileType) { this.filePath = filePath; this.fileType = fileType; } @Override protected ApiResult doInBackground(String... params) { File file = new File(filePath); totalSize = file.length(); Logger.d("Upload FileSize[%d]", totalSize); listener = new ProgressListener() { @Override public void transferred(long num) { publishProgress((int) ((num / (float) totalSize) * 100)); } }; String _fileType = FileType.VIDEO.equals(fileType) ? "video/mp4" : (FileType.IMAGE.equals(fileType) ? "image/jpeg" : "*/*"); return MyRestAdapter.getService().uploadFile(new CountingTypedFile(_fileType, file, listener), "/Mobile Uploads"); } @Override protected void onProgressUpdate(Integer... values) { Logger.d(String.format("progress[%d]", values[0])); //do something with values[0], its the percentage so you can easily do //progressBar.setProgress(values[0]); } } 

The CountingTypedFile es solo una copia de TypedFile pero incluye el ProgressListener.

Si desea obtener el valor máximo para mostrarlo en un registro de progreso, notificación, etc.

ProgressListener

 public interface ProgressListener { void transferred(long num, long max); } 

CountingTypedFile

 public class CountingTypedFile extends TypedFile { private static final int BUFFER_SIZE = 4096; private final ProgressListener listener; public CountingTypedFile(String mimeType, File file, ProgressListener listener) { super(mimeType, file); this.listener = listener; } @Override public void writeTo(OutputStream out) throws IOException { byte[] buffer = new byte[BUFFER_SIZE]; FileInputStream in = new FileInputStream(super.file()); long total = 0; try { int read; while ((read = in.read(buffer)) != -1) { total += read; this.listener.transferred(total, super.file().length()); out.write(buffer, 0, read); } } finally { in.close(); } } }