我正在研究在当前的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()
?
答案 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)
因为您要创建的许多流从未完成。