Как показать индикатор выполнения при загрузке файла в Android retrofit

#java #android #http-post #retrofit #retrofit2

#java #Android #http-post #модернизация #retrofit2

Вопрос:

Я разрабатываю приложение для Android с использованием retrofit. Я хочу загрузить файл любого типа на свой сервер с параметрами. Например, в моем приложении есть текстовое поле, например, поле электронной почты и поле загрузки файла. когда я ввел поля и нажал кнопку отправки. Он показывает процент загрузки файла и отправки файла и данных на сервер. когда процесс загрузки продолжается, он хочет показать процент заполненного файла. Как это возможно? Был ли какой-нибудь справочный сайт или учебник? Пожалуйста, помогите мне?

Ответ №1:

создайте этот интерфейс

 public interface ProgressListener {
                void transferred(long num);
            }
  

И этот класс

     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;
                    out.write(buffer, 0, read);

                    try{
                        if (this.listener != null)
                            this.listener.transferred(total);
                    }catch (Exception e){

                    }

                }
            } finally {
                in.close();
            }
        }
    }
  

Определите этот метод

 @POST("/{path}")
    public JsonObject makeRequestForAttachmentsUpload(@Path(value = "path", encode = false) String path, @Body MultipartTypedOutput multipartTypedOutput);
  

затем вызовите метод загрузки следующим образом

     RestClient restClient = new RestClient();
    ApiService apiService = restClient.getApiService();

MultipartTypedOutput multipartTypedOutput = new MultipartTypedOutput();
    // add and string parameters            
    for (String key : requestParams.keySet()) {
                    multipartTypedOutput.addPart(key, new TypedString(requestParams.get(key)));
                }

    // add attchments
                multipartTypedOutput.addPart(attachmentName, new CountingTypedFile(attachmentType, new File(attachmentPath), listener));
apiService.makeRequestForAttachmentsUpload(requestName, multipartTypedOutput);
  

и прослушайте прогресс, определив этого слушателя

 listener = new DPAPIService.ProgressListener() {
                @Override
                public void transferred(long num) {
                    publishProgress(((num / (float) fileSize)));
                }
        };
  

Комментарии:

1. Спасибо, Шабир. Я новичок в модернизации. Итак, можете ли вы сказать мне, что такое код gradle в Android studio.

2. Вы можете прочитать все подробности здесь futurestud.io/tutorials/retrofit-2-upgrade-guide-from-1-9

3. @shabir Ваш код использует старую модификацию. TypedFile не поддерживает новую модификацию. Я хочу новый модифицированный код.