Подтвердить что ты не робот

Android Retrofit - onProgressUpdate для показа уведомления о ходе работы

В настоящее время я использую Retrofit by Square для сетевых коммуникаций Android. Есть ли способ добиться успеха во время задачи для создания уведомления о ходе выполнения, что-то похожее на то, что использует Facebook при загрузке изображения?

Использовать Случае было бы, чтобы надежно загрузить изображение с полным качеством изображения без сжатия или масштабирования.

Я вижу, как это возможно с помощью asynctask, но это может превзойти цель использования Retrofit. Однако это может быть маршрут, который я должен был бы сделать.

4b9b3361

Ответ 1

Этот ответ для Retrofit 1. Для решения, совместимого с Retrofit 2 см. этот ответ.


У меня была та же проблема и, наконец, удалось это сделать. Я использовал spring lib раньше, а то, что я показываю ниже, работал на spring, но был непоследовательным, так как я допустил ошибку при использовании его для InputStream. Я переместил весь свой API для использования модификации, и загрузка была последней в списке, я просто переопределяю TypedFile writeTo(), чтобы обновить меня в байтах, прочитанных в OutputStream. Возможно, это можно улучшить, но, как я уже сказал, я сделал это, когда использовал spring, поэтому я просто использовал его повторно. Это код для загрузки, и он работает для меня в моем приложении, если вы хотите загрузить обратную связь, тогда вы можете использовать @Streaming и читать входной поток.

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.

Ответ 2

Если вы хотите получить максимальное значение, чтобы показать его на 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();
        }
    }
}