Как я могу показать прогресс для MultipartBody.Part [] в retrofit2 за запрос? - PullRequest
2 голосов
/ 02 февраля 2020

Я захожу по ссылкам ниже, но он загружает одно изображение на запрос.

Я хочу загрузить несколько изображений на запрос с retrofit2 с progress .

Можно ли отобразить индикатор выполнения при загрузке изображения с помощью Retrofit 2?

retrofit-множественный файл -загрузить-с-прогресс

1 Ответ

0 голосов
/ 02 февраля 2020

Да, используйте этот код

. Сначала добавьте этот класс в ваш проект:

public class ProgressRequestBody extends RequestBody{
    private static final int DEFAULT_BUFFER_SIZE=2048;
    private File file;
    private UploadCallbacks listener;
    private String content_type;
    public ProgressRequestBody(final File file,String content_type,final UploadCallbacks listener){
        this.content_type=content_type;
        this.file=file;
        this.listener=listener;
    }
    @Override public long contentLength(){
        return file.length();
    }
    @Override public MediaType contentType(){
        return MediaType.parse(content_type+"/*");
    }
    @Override public void writeTo(BufferedSink sink) throws IOException{
        long fileLength=file.length();
        byte[] buffer=new byte[DEFAULT_BUFFER_SIZE];
        try(FileInputStream in=new FileInputStream(file)){
            long uploaded=0;
            int read;
            Handler handler=new Handler(Looper.getMainLooper());
            while((read=in.read(buffer))!=-1){
                handler.post(new ProgressUpdater(uploaded,fileLength));
                uploaded+=read;
                sink.write(buffer,0,read);
            }
        }
    }
    public interface UploadCallbacks{
        void onProgressUpdate(int percentage);
    }
    private class ProgressUpdater implements Runnable{
        private long uploaded;
        private long total;
        public ProgressUpdater(long uploaded,long total){
            this.uploaded=uploaded;
            this.total=total;
        }
        @Override public void run(){
            listener.onProgressUpdate((int)(100*uploaded/total));
        }
    }
}

, затем внедрите ProgressRequestBody.UploadCallbacks в упражнении или фрагменте, который вы хотите показать в ходе выполнения.

class EditUserProfile4Fragment : BaseFragment(), ProgressRequestBody.UploadCallbacks {


    override fun onProgressUpdate(percentage: Int) {

    }
}

сейчас, для создания multipartBody, вам нужно использовать этот код

send(MultipartBody.Part.createFormData("IMAGE_NAME", "IMAGE_NAME", ProgressRequestBody(IMAGE_FILE, "CONTENT-TYPE", this@EditUserProfile4Fragment))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...