Android Retrofit – onProgressUpdate显示进度通知

我目前正在使用Square for Androidnetworking通信进行Retrofit。 在创build进度通知的任务期间,有没有办法获得进度,类似于Facebook在上传图片时使用的通知?

使用案例将是加载一个图像希望完整的图像质量没有压缩或缩放。

我看到如何用asynctask来实现这一点,但是这将会破坏使用Retrofit的目的。 但是,这可能是我必须采取的路线。

这个答案是为了改造1.为了解决scheme兼容改造2 看到这个答案 。


我有同样的问题,最终设法做到这一点。 我之前使用的是spring lib,以及我在下面展示的types是为Spring工作的,但是由于我在InputStream中使用它而犯了一个错误。 我移动了所有的API来使用retrofit ,上传是列表中的最后一个,我只是重写TypedFile writeTo()来更新我读取到OutputStream的字节。 也许这可以改善,但正如我所说,当我使用Spring时,所以我只是重复使用它。 这是上传的代码,它在我的应用程序上工作,如果你想下载反馈,那么你可以使用@Streaming并阅读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<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只是TypedFile的一个副本,但包含ProgressListener。

如果您想获得最大值以便在ProgressDialog,Notification等上显示它

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(); } } }