【问题标题】:RxJava filter behaviourRxJava 过滤器行为
【发布时间】:2017-04-26 16:12:43
【问题描述】:

我编写的代码在EditText 中对文本进行去抖动并过滤掉少于 4 个字符的文本:

charSequenceInitialValueObservable.skipInitialValue()
    .filter(new Predicate<CharSequence>() {
      @Override public boolean test(@NonNull CharSequence charSequence) throws Exception {
        Log.d("TAG", "l: " + charSequence.length());
        return charSequence.length() > 3;
      }
    })
    .doOnNext(new Consumer<CharSequence>() {
      @Override public void accept(@NonNull CharSequence charSequence) throws Exception {
        Log.d("TAG", "1. doOnNext: \"" + charSequence + "\"");
      }
    })
    .debounce(300, TimeUnit.MILLISECONDS)
    .doOnNext(new Consumer<CharSequence>() {
      @Override public void accept(@NonNull CharSequence charSequence) throws Exception {
        Log.d("TAG", "2. doOnNext: \"" + charSequence + "\"");
      }
    })
    .subscribeWith(new DisposableObserver<CharSequence>() {
      @Override
      public void onNext(@io.reactivex.annotations.NonNull CharSequence charSequence) {
        Log.d("TAG", "onNext: \"" + charSequence + "\"");
      }

      @Override public void onError(@io.reactivex.annotations.NonNull Throwable e) {
        Log.d("TAG", "onError: " + e.toString());
      }

      @Override public void onComplete() {
        Log.d("TAG", "onComplete");
      }
    });

当用户输入文本时 - 过滤工作正常,但当用户使用退格键时,最后一个空字符序列被传送到Subscriber

1. doOnNext: "test hhu"
l: 7
1. doOnNext: "test hh"
l: 6
1. doOnNext: "test h"
l: 5
1. doOnNext: "test "
l: 4
1. doOnNext: "test"
l: 3
l: 2
l: 1
l: 0
2. doOnNext: ""
onNext: ""

这是预期的行为吗?我应该在去抖后第二次使用过滤器运算符吗?如何正确过滤掉?

【问题讨论】:

  • 在 Android 上,您收到的 CharSequence 是可变的,因此在去抖动后评估时它可能会发生变化。您应该尽早通过 toString 将其映射为不可变字符串并使用它。
  • @akarnokd 这解决了我的问题。

标签: android rx-android rx-java2 rx-binding


【解决方案1】:

Debounce 在给定超时后没有传递任何值后通过最后一个值,因此理论上它应该通过"test"。 但是,唯一通过的值是 "",这可能表明该值不是不可变的,并且在通过 debounce 运算符之前被覆盖。

要解决此问题,请确保 charSequenceInitialValueObservable 仅接收不可变值或在 debounce 之前制作防御性副本。 (类似于.map(cs -&gt; new String(cs))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多