Search code examples
androidrx-javafrp

RxJava Android toMap operator stops execution


Hello I tried use rx java for next task

  1. Show fields of form
  2. Show errors on mistaked fields
  3. Return Observable> of valid field -> value

Solution

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

The last operator is never called. toMap is last executing operator. What's wrong?


Solution

  • I'd listen to the text change events and do a sweep over all text fields in some way:

    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);
    

    I'm not familiar with RxUtil but you'll probably find the necessary methods.