Показать прогресс загрузки изображения Multipart - PullRequest
3 голосов
/ 01 апреля 2019

Во фрагменте B у меня есть кнопка отправки, используемая для отправки изображения на сервер.Если нажать кнопку «Отправить», она вернется к фрагменту А. Я использую Multipart для загрузки изображения на сервер, и процесс выполняется на Thread, поэтому пользователь может выполнить другую задачу, ожидая загрузки изображения.

Фрагмент B (при нажатии кнопки отправки)

 inner class SimpleThread() :Thread() {
            override fun run() {
                for (i in newList!!) {
                    val service = RetrofitFactory.makeRetrofitService()
                    GlobalScope.launch(Dispatchers.IO) {
                        val request2 = WebApi.createImage(
                            activity,File(i)
                        )
                    }
                }
            }

WebApi

suspend fun createImage(
        file: File?
    ): WebApiResponse.Image? {
        val image = file?.let {
            MultipartBody.Part.createFormData(
                "image",
                it.getName(),
                RequestBody.create(MediaType.parse("image/*"), it)
            )
        }

        return RetrofitFactory.apiCall(context) {
            RetrofitFactory.makeRetrofitService().submitImages(
              image
            )
        }
    }

RetrofitService

@Multipart
    @POST("create_image")
    fun submitImages(
        @Part image: MultipartBody.Part?
    ): Deferred<Response<WebApiResponse.Image>>

Я могу загрузить изображение на сервер, но как показать прогресс загрузки изображения на фрагменте A?

Любая помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

так что после небольшого исследования я нашел для вас два способа

1 - если вы используете RxJava, я бы предложил следовать инструкциям и предостережениям в этой ссылке отображать ход выполненияmultipart с модернизацией с использованием RxJava

2 - если вы не используете RxJava, добавьте ProgressResponseBody к модификатору сборки, который будет выглядеть примерно так:

public class ProgressRequestBody extends RequestBody {
private File mFile;
private String mPath;
private UploadCallbacks mListener;
private String content_type;

private static final int DEFAULT_BUFFER_SIZE = 2048;

public interface UploadCallbacks {
    void onProgressUpdate(int percentage);
    void onError();
    void onFinish();
}

дляэтот вы должны использовать этот ответ

1 голос
/ 13 апреля 2019

Полагаю, вы можете использовать WorkManaget или IntenService для отображения прогресса. Образец для отправки через модификацию2 Вы можете начать процесс в сервисе. Служба может отправить новое событие.

0 голосов
/ 01 апреля 2019

Custom RequestBody

    public class FileProgressRequestBody extends RequestBody {

        public interface ProgressListener {
            void transferred(int size);
        }
        private RequestBody mRequestBody;

        protected ProgressListener listener;

        public FileProgressRequestBody(File file, String contentType, ProgressListener listener) {
            this.mRequestBody = RequestBody.create(MediaType.parse(contentType), file);
            this.listener = listener;
        }

        @Override
        public long contentLength() throws IOException{
            return mRequestBody.contentLength();
        }

        @Override
        public MediaType contentType() {
            return mRequestBody.contentType();
        }

        @Override
        public void writeTo(@NonNull BufferedSink sink) throws IOException {
            if (sink instanceof Buffer) {
                // Log Interceptor
                mRequestBody.writeTo(sink);
                return;
            }
            CountingSink countingSink = new CountingSink(sink);
            BufferedSink bufferedSink = Okio.buffer(countingSink);
            mRequestBody.writeTo(bufferedSink);
            bufferedSink.flush();
        }

        protected final class CountingSink extends ForwardingSink {
            private long bytesWritten = 0;

            public CountingSink(Sink delegate) {
                super(delegate);
            }

            @Override
            public void write(@NonNull Buffer source, long byteCount) throws IOException {
                super.write(source, byteCount);
                bytesWritten += byteCount;
                if (listener != null) {
                    long length = contentLength();
                    if (length != 0) {
                        listener.transferred(MathUtils.clamp((int) (bytesWritten * 100 / length), 0, 100));
                    }
                }
            }
        }
}

использовать MultipartBody.Part.createFormData("image", file.getName(), new FileProgressRequestBody(file, "image/*", youListener));

...