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(); } } }
- Android Retrofit参数化的@Headers
- 不支持的操作:Android,Retrofit,OkHttp。 在OkHttpClient中添加拦截器
- 翻新转换器工厂不能访问GsonConverterFactory
- 使用Retrofit刷新OAuth令牌,无需修改所有调用
- 改造GSON将date从jsonstring序列化为java.util.date
- 在Android中使用Retrofit
- 改进 – 多部分请求:所需的MultipartFile参数“文件”不存在
- 实施Retrofitcallback重新创build活动的最佳做法?
- 无法在Android Retrofit库中为我的课程创build转换器