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 :
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)) ;
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
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
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.
Ce? stackoverflow.com/questions/33338181/...