RxJava ObserveOn 没有正确传播元素?

RxJava ObserveOn does not properly propagate elements?

当用户在 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()

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

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

为什么会这样?

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

The issue has nothing to do with RxJava. The real problem is that TextWatcher.onTextChanged invoked with the same mutable CharSequence instance, so typing a new character into EditText will make all delayed values invalid.

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

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