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
为什么会这样?
TextView
的 TextWatcher
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);
}
})
...
当用户在 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
为什么会这样?
TextView
的 TextWatcher
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);
}
})
...