RxJava Android toMap运算符停止执行

时间:2015-10-14 19:44:00

标签: android rx-java frp

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

  1. 显示表单字段
  2. 在错误字段中显示错误
  3. Return Observable>有效字段 - >值
  4. 解决方案

    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是最后一个执行运算符。怎么了?

2 个答案:

答案 0 :(得分:1)

我会听取文字更改事件,并以某种方式扫描所有文字字段:

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,但您可能会找到必要的方法。

答案 1 :(得分:0)

问题很可能是您的源观察源并非全部完成。在源可观察完成之前,toMap()运算符不会调用onNext()。这是toMap()的大理石图供参考。

toMap() Marble Diagram