我试图通过一些延迟来监控文本更改,以避免来自侦听器的垃圾邮件。但当然,我不想收到一些已经处理过的物品。
这位观察员
RxTextView.textChanges(editText)
.delay(2, TimeUnit.SECONDS)
.distinctUntilChanged()
.filter(charSequence -> charSequence.length() != 0)
.subscribe(charSequence1 -> Log.e("!@#", charSequence1));
当我输入" abcd":
时,会发出这样的项目E/!@#: abcd
E/!@#: abcd
E/!@#: abcd
E/!@#: abcd
所以我收到了4次emmited项目,但字符串是等于的,distinctUntilChanged
。为什么distinctUntilChanged
在这种情况下不起作用?是否有可能通过rx运算符延迟实现此逻辑?
答案 0 :(得分:8)
如果我没记错的话,textChanges或文本控件会重复使用相同的CharSequence,因此你会遇到这种异常现象。您必须在延迟之前使用map(v - > new String(v))来创建不可变副本。
当用户停止输入时,是否可以仅返回最后结果?在这种情况下abcd一次?最后()不是我理解的这个问题。
查看User
运算符的示例。