3
votes

Afficher la progression de l'image de téléchargement en plusieurs parties

Dans le fragment B, j'ai un bouton d'envoi utilisé pour soumettre l'image au serveur. Lorsque le bouton d'envoi est cliqué, il reviendra au fragment A. J'utilise Multipart pour télécharger l'image sur le serveur, et le processus s'exécute sur Thread afin que l'utilisateur puisse effectuer une autre tâche tout en image en attente pour l'importation.

Fragment B (lorsque vous cliquez sur le bouton d'envoi)

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

WebApi p >

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

 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)
                        )
                    }
                }
            }

Je peux importer une image sur le serveur, mais comment puis-je afficher un télécharger la progression de l'image sur le fragment A?

Toute aide est appréciée.


3 Réponses :


-1
votes

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));
                    }
                }
            }
        }
}

utilise MultipartBody.Part.createFormData ("image", file.getName (), new FileProgressRequestBody (file, "image / *", youListener)) ;


3 commentaires

EventBus et ainsi de suite.


qu'est-ce que youListener dans votre dernier commentaire?


la progression dans transféré montre 100 mais mon image est toujours en cours de téléchargement



1
votes

donc après juste un peu de recherche, j'ai trouvé deux façons pour vous

1- si vous utilisez RxJava , je suggérerais de suivre les instructions et les mises en garde dans ce lien afficher la progression du multipart avec la modernisation en utilisant RxJava

2- si vous n'utilisez pas RxJava ajoutez un ProgressResponseBody au constructeur de mise à niveau qui ressemblerait à ceci: p>

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();
}

pour celui-ci, vous devez utiliser cette réponse


0 commentaires

1
votes

Je suppose que vous pouvez utiliser WorkManaget ou IntenService pour afficher la progression. Un échantillon à envoyer via retrofit2 Vous pouvez démarrer le processus en service. Le service peut envoyer un nouvel événement.


0 commentaires