如何处理列表中的所有项目然后使用RxJava完成

时间:2018-12-20 14:45:34

标签: rx-java2

我正在研究在当前的Android应用程序中使用RxJava。

我坚持下面的用例。

对于特定数据库表上的每个数据行,我希望执行HTTP POST调用,一旦所有POST完成,确定,我需要清除数据库表。

我的代码如下:-

login()
                .andThen(Single.defer(() -> DatabaseController.fetchSingleRealmObjects(UpdateDO.class)))
                .toObservable()
                .flatMapIterable(update -> update)
                .flatMap(this::parameteriseUpdate)
                .doOnNext(NetworkController::update)
                .doOnComplete(() -> DatabaseController.deleteAll(UpdateDO.class))
                .ignoreElements()
                .retryWhen(errors -> errors.flatMap(e -> constructRetryHandler(retryCounter, e)))
                .doOnComplete(onComplete)
                .doOnError(onError)
                .doAfterTerminate(doAfterTerminate())
                .doOnSubscribe(compositeDisposable::add)
                .blockingAwait();

当UpdateDO表为空时,以上代码将按预期完成。

但是,当数据行存在时,doOnNext()

中的进程“粘滞”

我意识到这是因为我只打emitter.onNext()

private ObservableSource<Map<String, Object>> parameteriseUpdate(final UpdateDO updateDO) {
        final Map<String, Object> fields = new HashMap<>();
        fields.put(FIELD_NAME_DRUG_ID, updateDO.getDrugId());
        fields.put(FIELD_NAME_STORE_CONTENT_ID, updateDO.getStoreContentId());
        fields.put(FIELD_NAME_STORE_ID, updateDO.getStoreID());
        fields.put(FIELD_NAME_ACTUAL_QUANTITY, updateDO.getActualQty());
        fields.put(FIELD_NAME_VARIANCE, updateDO.getUnitQty());
        fields.put(FIELD_NAME_REMARKS, updateDO.getRemarks());
        fields.put(FIELD_NAME_CREATED_BY, updateDO.getCreatedBy());

        return Observable.create(emitter -> emitter.onNext(fields));
    }

但是我看不到如何解决此问题,如何重构代码以允许调用emitter.onComplete()

1 个答案:

答案 0 :(得分:2)

我认为最好从返回ObservableSource<Map<String, Object>>更改该功能 像这样的简单功能

private Map<String, Object> parameteriseUpdate(final UpdateDO updateDO) {
    final Map<String, Object> fields = new HashMap<>();
    fields.put(FIELD_NAME_DRUG_ID, updateDO.getDrugId());
    fields.put(FIELD_NAME_STORE_CONTENT_ID, updateDO.getStoreContentId());
    fields.put(FIELD_NAME_STORE_ID, updateDO.getStoreID());
    fields.put(FIELD_NAME_ACTUAL_QUANTITY, updateDO.getActualQty());
    fields.put(FIELD_NAME_VARIANCE, updateDO.getUnitQty());
    fields.put(FIELD_NAME_REMARKS, updateDO.getRemarks());
    fields.put(FIELD_NAME_CREATED_BY, updateDO.getCreatedBy());

    return fields;
}

并将其称为地图,而不是像这样的平面图:

.map(this::parameteriseUpdate)

因为您要创建的许多流从未完成。