如何使用 RxBinding 处理不同的值 RxTextView.textChangeEvents

How to process distinct values using RxBinding RxTextView.textChangeEvents

我在当前的 Android 应用程序中使用 RxBinding,并希望实现文本搜索功能。

我的代码如下:-

compositeDisposable.add(RxTextView.textChangeEvents(searchEditText)
                .skipInitialValue()
                .subscribeOn(Schedulers.io())
                .debounce(200, TimeUnit.MILLISECONDS)
                .filter(textViewTextChangeEvent -> (textViewTextChangeEvent.text().length() == 0 || textViewTextChangeEvent.text().length() > 2))
                .map(event -> event.text().toString())
                .distinct()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(charactersResponse -> {
                    articlesLiveData = viewModel.textSearch(charactersResponse);
                    textLiveData.removeObserver(TextFragment.this);
                    textLiveData.observe(TextFragment.this, TextFragment.this);
                }));

我只想搜索不同的值,但是上面的代码产生了重复的搜索请求。

为什么 distinct 不能删除重复的字符串?

例如,当我在我的搜索 EditText

中输入 "chilean"

我的搜索代码使用以下字符串调用

chi
chi
chil
chil
chil
chile
chile
chilea
chilean
chilean

我做错了什么?

在没有更多上下文的情况下,我真的不能确定,但​​似乎已经进行了两次订阅。你说你把这段代码放在 Fragment::onViewCreated 中,所以也许你正在加载另一个片段然后返回到这个片段而不处理第一个订阅?您可以在进行订阅的地方放置一个断点,以查看它是否被调用两次。如果它只被调用一次而你仍然有这个问题,我将需要查看你的更多代码来诊断它。

当我将您的代码复制到 Activity::onCreate 时,它按预期工作。因此,您可以做的第一件事就是确保在 Fragment::onDestroyView 中处理您的 compositeDisposable。这应该可以解决多次发射问题。

现在您将遇到另一个问题:您正在使用 distinct(),但我怀疑这就是您想要的搜索栏。 Distinct 将在可观察对象的生命周期内过滤所有非唯一值。因此,一旦它发出 "chile",如果您继续键入 "chilean" 然后删除 "an",您将永远不会再看到 "chile"。您可能想要的是 distinctUntilChanged(),它只是过滤掉与最后发出的值的非唯一匹配项。