Android Retrofit - onProgressUpdate to show progress notification

I am currently using Retrofit by Square for Android network communications. Is there a way to succeed during a task to create a progress notification, something similar to what Facebook uses when uploading an image?

Use Case would be to reliably download an image with full image quality without compression or scaling.

I see how this is possible with asynctask, but it can exceed the goal of using Retrofit. However, this may be a route that I would have to do.

+34
android android-asynctask retrofit
Apr 28 '14 at 18:41
source share
2 answers

This answer is for Retrofit 1. For a solution compatible with Retrofit 2, see this answer .




I had the same problem and finally managed to do it. I used spring lib before, and what I show below worked for spring, but was inconsistent since I made a mistake when using it for InputStream. I moved my entire API to use the modification, and the load was the last one on the list, I just override TypedFile writeTo () to update me in bytes read in OutputStream. It may be possible to improve, but as I said, I did it when I used spring, so I just used it again. This is the code to download, and it works for me in my application, if you want to download feedback, then you can use @Streaming and read the input stream.

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<String, Integer, ApiResult> { 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]); } } 

CountingTypedFile is just a copy of the TypedFile , but including the ProgressListener.

+67
Jul 16 '14 at 4:08
source share

If you want to get the maximum value to show it on ProgressDialog, Notification, 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(); } } } 
-one
Sep 28 '15 at 16:21
source share



All Articles