2015-10-14 41 views
1

你好,我試圖使用RX Java進行下一個任務RxJava的Android toMap操作員停止執行

  1. 形式的顯示領域
  2. 上mistaked領域顯示錯誤
  3. 返回可觀察>有效字段的 - >值

解決方案

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是最後一個執行操作符。怎麼了?

+0

ToMap需要一個有限的源,你的可能不會終止。 – akarnokd

+0

@akarnokd我可以使用哪個運算符來獲取Observable > – punksta

+0

我會在debounce之後使用'map',用for循環掃描所有字段並手動將正確的輸入收集到Map中,然後把它返還。 – akarnokd

回答

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但你可能會發現必要的方法。

+0

這是骯髒的黑客) – punksta

0

問題很可能是您的源observable不完全。 toMap()運營商將不會調用onNext(),直到源observable完成。以下是toMap()的大理石圖表供參考。

toMap() Marble Diagram