2017-01-23 10 views
0

Я использую Retrofit 2 для загрузки JSON на сервер. JSON имеет некоторые кодированные BASE64 изображения, поэтому требуется время для загрузки всего. Я хотел бы видеть процент загрузки. Я уже нашел решения для существующих файлов, но это не файл, и сервер принимает эту форму.Android Retrofit 2 Процент загрузки объекта JSON

ответ

0

Для кого-то с той же проблемой, я приспособил вспомогательный класс (ProgressOutputStream) из этой библиотеки: https://github.com/lizhangqu/CoreProgress и мой рабочий код выглядит следующим образом: (работа для загрузки файлов и загрузки JSON тоже)

import java.io.IOException; 

import okhttp3.MediaType; 
import okhttp3.RequestBody; 
import okio.BufferedSink; 
import okio.Okio; 

public class UploadProgressRequestBody extends RequestBody { 
    private final RequestBody requestBody; 
    private final ProgressListener progressListener; 

    public UploadProgressRequestBody(RequestBody requestBody) { 
     this.requestBody = requestBody; 
     this.progressListener = getDefaultProgressListener(); 
    } 

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

    @Override public long contentLength() { 
     try { 
      return requestBody.contentLength(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return -1; 
    } 

    @Override 
    public void writeTo(BufferedSink sink) throws IOException { 
     if (progressListener == null) { 
      requestBody.writeTo(sink); 
      return; 
     } 
     ProgressOutputStream progressOutputStream = new ProgressOutputStream(sink.outputStream(), progressListener, contentLength()); 
     BufferedSink progressSink = Okio.buffer(Okio.sink(progressOutputStream)); 
     requestBody.writeTo(progressSink); 
     progressSink.flush(); 
    } 

    interface ProgressListener { 
     void update(long bytesWritten, long contentLength); 
    } 

    private ProgressListener getDefaultProgressListener(){ 
     ProgressListener progressListener = new UploadProgressRequestBody.ProgressListener() { 
      @Override public void update(long bytesRead, long contentLength) { 
       System.out.println("bytesRead: "+bytesRead); 
       System.out.println("contentLength: "+contentLength); 
       System.out.format("%d%% done\n", (100 * bytesRead)/contentLength); 
      } 
     }; 

     return progressListener; 
    } 

} 

===========

import java.io.IOException; 
import java.io.OutputStream; 

class ProgressOutputStream extends OutputStream { 
    private final OutputStream stream; 
    private final UploadProgressRequestBody.ProgressListener listener; 

    private long total; 
    private long totalWritten; 

    ProgressOutputStream(OutputStream stream, UploadProgressRequestBody.ProgressListener listener, long total) { 
     this.stream = stream; 
     this.listener = listener; 
     this.total = total; 
    } 

    @Override 
    public void write(byte[] b, int off, int len) throws IOException { 
     this.stream.write(b, off, len); 
     if (this.total < 0) { 
      this.listener.update(-1, -1); 
      return; 
     } 
     if (len < b.length) { 
      this.totalWritten += len; 
     } else { 
      this.totalWritten += b.length; 
     } 
     this.listener.update(this.totalWritten, this.total); 
    } 

    @Override 
    public void write(int b) throws IOException { 
     this.stream.write(b); 
     if (this.total < 0) { 
      this.listener.update(-1, -1); 
      return; 
     } 
     this.totalWritten++; 
     this.listener.update(this.totalWritten, this.total); 
    } 

    @Override 
    public void close() throws IOException { 
     if (this.stream != null) { 
      this.stream.close(); 
     } 
    } 

    @Override 
    public void flush() throws IOException { 
     if (this.stream != null) { 
      this.stream.flush(); 
     } 
    } 
} 

==========

OkHttpClient client = new OkHttpClient.Builder() 
    .addNetworkInterceptor(new Interceptor() { 
     @Override public Response intercept(Chain chain) throws IOException { 
      Request originalRequest = chain.request(); 

      if (originalRequest.body() == null) { 
       return chain.proceed(originalRequest); 
      } 

      Request progressRequest = originalRequest.newBuilder() 
        .method(originalRequest.method(), 
          new UploadProgressRequestBody(originalRequest.body())) 
        .build(); 

      return chain.proceed(progressRequest); 
     } 
    }).build(); 

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(baseUrl) 
     .client(client) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .build(); 

 Смежные вопросы

  • Нет связанных вопросов^_^