Android uploadファイルコールバックの進捗状況
3228 ワード
1.RequestBodyを継承し、進行状況を監視できるFileRequestBodyを実現
public class FileRequestBody extends RequestBody//private RequestBody mRequestBody;private UploadListener mUploadListener;private CountingSink mCountingSink;
}進捗状況リスニングコールバック
public interface UploadListener { void onRequestProgress(long bytesWritten, long contentLength); }
2.ブロック定義public class UpLoadProgressInterceptor implements Interceptor{private UploadListener mUploadListener;
}
Retrofitを取得するときは、カスタムブロッキング:private static TjRetrofitService retroUploadFileService;public static TjRetrofitService getUploadWithProgressService(UploadListener uploadListener){ UpLoadProgressInterceptor interceptor = new UpLoadProgressInterceptor(uploadListener); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .retryOnConnectionFailure(true) .connectTimeout(TIMEOUT, TimeUnit.SECONDS) .readTimeout(TIMEOUT,TimeUnit.SECONDS) .writeTimeout(TIMEOUT,TimeUnit.SECONDS) .build(); if(retroUploadFileService ==null){ retroUploadFileService =new Retrofit.Builder().baseUrl(RequestUrl.getUploadUrl()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(client) .build() .create(TjRetrofitService.class); } return retroUploadFileService; }
ここでTjRetrofitService:インタフェースを定義する
public interface TjRetrofitService {
}
public class FileRequestBody extends RequestBody//private RequestBody mRequestBody;private UploadListener mUploadListener;private CountingSink mCountingSink;
public FileRequestBody(RequestBody mRequestBody, UploadListener mUploadListener) {
this.mRequestBody = mRequestBody;
this.mUploadListener = mUploadListener;
}
@Nullable
@Override
public MediaType contentType() {
return mRequestBody.contentType();
}
@Override
public long contentLength() throws IOException {
try {
return mRequestBody.contentLength();
} catch (IOException e) {
e.printStackTrace();
return -1;
}
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
BufferedSink bufferedSink;
mCountingSink = new CountingSink(sink);
bufferedSink = Okio.buffer(mCountingSink);
mRequestBody.writeTo(bufferedSink);
// flush,
bufferedSink.flush();
}
class CountingSink extends ForwardingSink {
private long bytesWritten = 0;
public CountingSink(Sink delegate) {
super(delegate);
}
@Override
public void write(Buffer source, long byteCount) throws IOException {
super.write(source, byteCount);
bytesWritten += byteCount;
mUploadListener.onRequestProgress(bytesWritten, contentLength());
}
}
}進捗状況リスニングコールバック
public interface UploadListener { void onRequestProgress(long bytesWritten, long contentLength); }
2.ブロック定義public class UpLoadProgressInterceptor implements Interceptor{private UploadListener mUploadListener;
public UpLoadProgressInterceptor(UploadListener mUploadListener) {
this.mUploadListener = mUploadListener;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request =chain.request();
if(null==request.body()){
return chain.proceed(request);
}
Request builder =request.newBuilder()
.method(request.method(),new FileRequestBody(request.body(),mUploadListener))
.build();
return chain.proceed(builder);
}
}
Retrofitを取得するときは、カスタムブロッキング:private static TjRetrofitService retroUploadFileService;public static TjRetrofitService getUploadWithProgressService(UploadListener uploadListener){ UpLoadProgressInterceptor interceptor = new UpLoadProgressInterceptor(uploadListener); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .retryOnConnectionFailure(true) .connectTimeout(TIMEOUT, TimeUnit.SECONDS) .readTimeout(TIMEOUT,TimeUnit.SECONDS) .writeTimeout(TIMEOUT,TimeUnit.SECONDS) .build(); if(retroUploadFileService ==null){ retroUploadFileService =new Retrofit.Builder().baseUrl(RequestUrl.getUploadUrl()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(client) .build() .create(TjRetrofitService.class); } return retroUploadFileService; }
ここでTjRetrofitService:インタフェースを定義する
public interface TjRetrofitService {
/**
*
*
* @return
*/
@GET("tjs/pad/tjs/sys/getConfig")
Observable> mGetConfig();
}