RxJava Android toMap 运算符停止执行

RxJava Android toMap operator stops execution

您好,我尝试使用 rx java 进行下一个任务

  1. 显示表单字段
  2. 显示错误字段的错误
  3. 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,但您可能会找到必要的方法。