Android Retrofit – onProgressUpdate用于显示进度通知

我目前正在使用Retrofit by Square来进行Android网络通信。有没有办法在任务创建进度通知,类似于Facebook上传图像时使用的任务?

使用情况将加载图像希望完整的图像质量,而不压缩或缩放。

我看到如何使用asynctask是可能的,但会失败使用Retrofit的目的。然而,这可能是我需要采取的路线。

这个答案是为Retrofit 1.对于与Retrofit 2 see this answer兼容的解决方案。

我有同样的问题,最后设法做到了。我使用spring lib之前,我显示下面种类为Spring工作,但是不一致,因为我犯了一个错误使用它的InputStream。我移动了所有我的API的使用改造和上传是列表中的最后一个,我只是重写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。

http://stackoverflow.com/questions/23348812/android-retrofit-onprogressupdate-for-showing-progress-notification

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Android Retrofit – onProgressUpdate用于显示进度通知