RxJava ObserveOn没有正确传播元素?

时间:2015-11-24 16:45:06

标签: java android rx-java

当用户在TextView中输入文本时,我正在尝试进行搜索:

RxTextView.textChangeEvents(mTextView)
  .doOnNext(new Action1<CharSequence>() {
    @Override
    public void call(CharSequence charSequence) {
      System.out.println("OnNext: " + charSequence);
    }
  })
  .observeOn(mSchedulerProvider.computation())
  .delay(1, SECONDS, mSchedulerProvider.computation())
  .map(new Func1<CharSequence, Object>() {
    @Override
    public void call(CharSequence charSequence) {
      System.out.println("Map: " + charSequence);
    }
  })
  .subscribe()

当我在Android设备上执行此代码3次按“a”按钮时,我得到以下结果:

onNext: a
onNext: aa
onNext: aaa
Map: aaa
Map: aaa
Map: aaa

我原本预计CharSequence的序列与onNext电话中的序列相同。

当我在JVM上运行以下测试时:

    mQuerySubject.onNext("a");
    mSchedulerProvider.computation().advanceTimeBy(150, TimeUnit.MILLISECONDS);
    mQuerySubject.onNext("aa");
    mSchedulerProvider.computation().advanceTimeBy(150, TimeUnit.MILLISECONDS);
    mQuerySubject.onNext("aaa");

    mSchedulerProvider.computation().advanceTimeBy(2, TimeUnit.SECONDS);
    mSchedulerProvider.computation().triggerActions();

..它打印出预期的结果:

onNext: a
onNext: aa
onNext: aaa
Map: a
Map: aa
Map: aaa

为什么会这样?

1 个答案:

答案 0 :(得分:0)

TextView TextWatcher seems to reuse(可变)CharSequence用于新更新,同时更改所有延迟项目。

  

该问题与RxJava无关。真正的问题是TextWatcher.onTextChanged使用相同的可变CharSequence实例调用,因此在EditText中键入新字符将使所有延迟值无效。

因此,首先将CharSequence映射到String可以解决问题:

RxTextView.textChangeEvents(mTextView)
  .map(new Func1<CharSequence, String>() {
    @Override
    public void call(CharSequence charSequence) {
      return String.valueOf(charSequence);
    }
  })
  ...