RxJava Android toMap 运算符停止执行
RxJava Android toMap operator stops execution
您好,我尝试使用 rx java 进行下一个任务
- 显示表单字段
- 显示错误字段的错误
- Return Observable> 有效字段 -> 值
解决方案
List<Observable<RxUtil.EditTextEvent>> listOfObs = new ArrayList<>();
...fill form, fill listOfObs
return Observable.merge(listOfObs) // stream of EdtText events
.debounce(5, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext((onTextChangeEvent) -> { // show error, if user made mistake
if (!CheckOutUtils.isInputCorrect(onTextChangeEvent))
onTextChangeEvent.editText.setError("Проверьте поле");
})
.filter(CheckOutUtils::isInputCorrect) // only valid fields
.toMap(editTextEvent -> (Field) editTextEvent.editText.getTag(), editTextEvent -> editTextEvent.text) // called on every change
.doOnNext(fieldStringMap -> {
Log.v("map", fieldStringMap.toString()); // never called
}); // map of it
永远不会调用最后一个运算符。 toMap 是最后执行的运算符。怎么了?
问题很可能是您的源可观察量没有全部完成。 toMap()
运算符不会调用 onNext()
直到源可观察对象完成。这是toMap()
的弹珠图供参考。
我会监听文本更改事件并以某种方式扫描所有文本字段:
List<TextField> fields = ...
Observable<TextField> all = Observable.from(fields);
all
.flatMap(f -> RxUtil.textChangedObservable(f))
.debounce(5, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.flatMap(f ->
all
.filter(f -> isCorrect(f.getText()))
.toMap(f -> f.getTag(), f -> getText())
)
.subscribe(System.out::println);
我不熟悉 RxUtil,但您可能会找到必要的方法。
您好,我尝试使用 rx java 进行下一个任务
- 显示表单字段
- 显示错误字段的错误
- Return Observable> 有效字段 -> 值
解决方案
List<Observable<RxUtil.EditTextEvent>> listOfObs = new ArrayList<>();
...fill form, fill listOfObs
return Observable.merge(listOfObs) // stream of EdtText events
.debounce(5, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext((onTextChangeEvent) -> { // show error, if user made mistake
if (!CheckOutUtils.isInputCorrect(onTextChangeEvent))
onTextChangeEvent.editText.setError("Проверьте поле");
})
.filter(CheckOutUtils::isInputCorrect) // only valid fields
.toMap(editTextEvent -> (Field) editTextEvent.editText.getTag(), editTextEvent -> editTextEvent.text) // called on every change
.doOnNext(fieldStringMap -> {
Log.v("map", fieldStringMap.toString()); // never called
}); // map of it
永远不会调用最后一个运算符。 toMap 是最后执行的运算符。怎么了?
问题很可能是您的源可观察量没有全部完成。 toMap()
运算符不会调用 onNext()
直到源可观察对象完成。这是toMap()
的弹珠图供参考。
我会监听文本更改事件并以某种方式扫描所有文本字段:
List<TextField> fields = ...
Observable<TextField> all = Observable.from(fields);
all
.flatMap(f -> RxUtil.textChangedObservable(f))
.debounce(5, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.flatMap(f ->
all
.filter(f -> isCorrect(f.getText()))
.toMap(f -> f.getTag(), f -> getText())
)
.subscribe(System.out::println);
我不熟悉 RxUtil,但您可能会找到必要的方法。