首先展示效果如下:
本demo使用的是rxjava2, rxjava1也是可以使用的;主要核心代码如下:
1.创建个listener
/**
* Created by JokAr on 2017/3/6.
*/
public interface UploadListener {
void onRequestProgress(long bytesWritten, long contentLength);
}
2.获取上传进度
/**
* Created by JokAr on 2017/3/6.
*/
public class CountingRequestBody extends RequestBody {
private RequestBody mRequestBody;
private UploadListener mUploadListener;
private CountingSink mCountingSink;
public CountingRequestBody(RequestBody requestBody, UploadListener uploadListener) {
mRequestBody = requestBody;
mUploadListener = uploadListener;
}
@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);
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());
}
}
}
3.添加拦截器
/**
* Created by JokAr on 2017/3/6.
*/
public class UpLoadProgressInterceptor implements Interceptor {
private UploadListener mUploadListener;
public UpLoadProgressInterceptor(UploadListener uploadListener) {
mUploadListener = uploadListener;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if(null == request.body()){
return chain.proceed(request);
}
Request build = request.newBuilder()
.method(request.method(),
new CountingRequestBody(request.body(),
mUploadListener))
.build();
return chain.proceed(build);
}
}
4.使用方法
public static Retrofit getRetrofit(UploadListener listener) {
UpLoadProgressInterceptor interceptor = new UpLoadProgressInterceptor(listener);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.retryOnConnectionFailure(true)
.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.build();
return new Retrofit.Builder()
.baseUrl(BASE_URL + "/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
- 单个文件上传:
@Override
public void uploadFile(File file,
UploadListener listener,
@NonNull LifecycleTransformer transformer,
@NonNull final UploadFileCallBack callBack) {
if (file != null && file.exists()) {
RequestBody requestFile =
RequestBody.create(MediaType.parse("application/otcet-stream"), file);
MultipartBody.Part body =
MultipartBody.Part.createFormData("file", file.getName(), requestFile);
UploadNetWorkConfig.getRetrofit(listener)
.create(UploadFileService.class)
.uploadHead(body)
.compose(transformer)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.map(new HttpResultFunc())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new ResourceObserver<UploadEntities>() {
@Override
protected void onStart() {
super.onStart();
callBack.onStart();
}
@Override
public void onNext(UploadEntities data) {
callBack.result(data);
}
@Override
public void onError(Throwable e) {
callBack.requestError(e);
}
@Override
public void onComplete() {
callBack.complete();
}
});
}
}
- 多个文件上传:
/**
* 上传多个文件
*
* @param pathList
* @param listener
* @param transformer
* @param callBack
*/
@Override
public void uploadMultiFile(String[] pathList,
UploadListener listener,
@NonNull LifecycleTransformer transformer,
@NonNull final UploadMultiFileCallBack callBack) {
if (pathList != null && pathList.length > 0) {
ArrayList<Observable> observables = new ArrayList<>();
for (String path : pathList) {
File file = new File(path);
if (file.exists()) {
RequestBody requestFile =
RequestBody.create(MediaType.parse("application/otcet-stream"), file);
MultipartBody.Part body =
MultipartBody.Part.createFormData("file", file.getName(), requestFile);
Observable<String> observable = UploadNetWorkConfig.getRetrofit(listener)
.create(UploadFileService.class)
.uploadHead(body)
.compose(transformer)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.map(new HttpResultFunc());
observables.add(observable);
}
file = null;
}
Observable[] observables1 = new Observable[observables.size()];
observables1 = (Observable[]) observables.toArray();
observables = null;
Observable.zipArray(new Function<Object[], ArrayList<UploadEntities>>() {
/**
* Apply some calculation to the input value and return some other value.
*
* @param objects the input value
* @return the output value
* @throws Exception on error
*/
@Override
public ArrayList<UploadEntities> apply(@NonNull Object[] objects) throws Exception {
ArrayList<UploadEntities> arrayList = new ArrayList<>();
for (Object object : objects) {
arrayList.add((UploadEntities) object);
}
return arrayList;
}
}, true, 1, observables1)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new ResourceObserver<ArrayList<UploadEntities>>() {
@Override
protected void onStart() {
super.onStart();
callBack.onStart();
}
@Override
public void onNext(ArrayList<UploadEntities> data) {
callBack.result(data);
}
@Override
public void onError(Throwable e) {
callBack.requestError(e);
}
@Override
public void onComplete() {
callBack.complete();
}
});
}
}
主要代码就是这些了;完整demo请看这里:
https://github.com/MichaelJokAr/RxUpload
如果你觉得对你有用,欢迎start