首页 > 解决方案 > 如何使用 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);
                }));

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

为什么不区分删除重复的字符串?

例如,当我在搜索 EditText 中输入“chilean”时

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

chi
chi
chil
chil
chil
chile
chile
chilea
chilean
chilean

我究竟做错了什么?

标签: androidandroid-edittextrx-binding

解决方案


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

当我将您的代码复制到 Activity::onCreate 时,它​​按预期工作。所以你可以做的第一件事是确保你在 Fragment::onDestroyView 中处理你的compositeDisposable。这应该可以解决多重排放问题。

现在您将遇到另一个问题:您正在使用distinct(),但我怀疑这就是您想要从搜索栏中获得的。Distinct 将在可观察对象的生命周期内过滤所有非唯一值。所以一旦它发出了“chile”,如果你继续输入“chilean”然后删除“an”,你就再也看不到“chile”了。您可能想要的是distinctUntilChanged(),它只是过滤掉与 LAST 发出的值的非唯一匹配项。


推荐阅读