功能前提:公司在开发是需要实现上传多张照片功能,后台接口只支持一张一张的发送,Android端需要每一张图片上传都要调用一次上传接口,发送完所有图片需要更新UI布局,所以实现起来需要考虑两个问题:
1 轮训发送网络请求有序监听网络返回。
2 所有请求完成后的一个完成监听。
有了前提和需要考虑的问题就是制定方案,开始踩坑,想过通过for循环和判断集合大小来实现判断是否完成所有操作(for循环发送一条数据将集合移除这条数据,然后在网络请求响应方法里面判断是否是最后提条)很快pass掉数据返回无序并不准确。另找办法百度大神帮了忙Rxjava可以实现,于是开始着手学习Rxjava的实现方式期间找到两种方法具体如下:
1 通过Observable.concat()方法实现被合并多个被观察者(有序方法)。
2 通过Observable.merge()方法实现(无需)。
很显然前者是我需要的方法不在说废话直接上代码:
public class GroupContinuationApplyPresenter extends BasePresenter<ILoadDataView> {
private CallBackData callBackData;
private List<String> list = new ArrayList<>();
public void setCallBackData(CallBackData callBackData) {
this.callBackData = callBackData;
}
public GroupContinuationApplyPresenter(ILoadDataView view, Context context) {
super(view, context);
}
public void getConsultationPurposes(String tId) {
loadConsultationPurposes().subscribe(new DisposableObserver<ArrayList<String>>() {
@Override
public void onNext(@NonNull ArrayList<String> purpuses) {
Log.d("输出会诊目的集合", purpuses.size() + "");
callBackData.CallBack(purpuses);
}
@Override
public void onError(@NonNull Throwable e) {
getView().hideLoading();
getView().showErrorToast(e.getMessage());
}
@Override
public void onComplete() {
}
});
}
//图片上传方法
public void UpLoadPic(List<String> dataList) {
list.clear();
getView().showLoading();
for (String str : dataList) {
if ("-1".equals(str)) {
dataList.remove(str);
}
}
//创建观察者调用concat方法传入被观察者集合 完成订阅监听
Observable.concat(ReBuildData(dataList)).subscribe(new DisposableObserver<String>() {
@Override
public void onNext(@NonNull String purpuses) {
//监听每次网络请求的返回数据。
getView().hideLoading();
new Toastor(context).showToast("一张附件图片上传完成");
list.add(purpuses);
}
@Override
public void onError(@NonNull Throwable e) {
getView().hideLoading();
getView().showErrorToast(e.getMessage());
}
@Override
public void onComplete() {
//所有网络请求完成监听
getView().hideLoading();
new Toastor(context).showToast("附件上传完成");
}
});
}
//创建被观察者集合
private List<Observable<String>> ReBuildData(List<String> paths) {
List<Observable<String>> events = new ArrayList<>();
for (String str : paths) {
if (str.startsWith("http") || str.startsWith("https")) {
continue;
}
events.add(UploadPicData(str));
}
return events;
}
//创建被观察者(异步网络请求)
private Observable<String> UploadPicData(String path) {
File file = new File(path);
RequestBody requestFile = RequestBody.create(MultipartBody.FORM, file);
MultipartBody.Part mp = MultipartBody.Part.createFormData("file", NetUtils.getValueEncoded(file.getName()), requestFile);
return executeAndCheckAPI(getApi().uploadFormPic(mp))
.doOnSubscribe(disposable -> getView().showLoading())
.flatMap((Function<BaseDataResponse<UploadPicRes>, ObservableSource<String>>) response -> {
getView().hideLoading();
return Observable.just(response.getData().getThumbnail());
});
}
private Observable<ArrayList<String>> loadConsultationPurposes() {
return executeAndCheckAPI(getApi().getConsultationPurposes(HealthMgmtApplication.getApp().getSelectedTenantId()))
.doOnSubscribe(disposable -> getView().showLoading())
.flatMap((Function<BaseListResponse<String>, ObservableSource<ArrayList<String>>>) response -> {
getView().hideLoading();
ArrayList<String> purposes = new ArrayList<>();
if (response.getData() != null) {
purposes.addAll(response.getData());
}
return Observable.just(purposes);
});
}
public interface CallBackData {
void CallBack(ArrayList<String> purpuses);
}
}运行结果展示:

版权声明:本文为woshiawai原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。