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