Rxjava学习----------实现轮询集合发送多条网络请求并实现合并监听网络反馈功能。

功能前提:公司在开发是需要实现上传多张照片功能,后台接口只支持一张一张的发送,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版权协议,转载请附上原文出处链接和本声明。