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

Android 如何使用RxBinding RxTextView.textChangeEvents处理不同的值,android,android-edittext,rx-binding,Android,Android Edittext,Rx Binding,我在当前的Android应用程序中使用RxBinding,希望实现一个文本搜索功能 我的代码如下:- compositeDisposable.add(RxTextView.textChangeEvents(searchEditText) .skipInitialValue() .subscribeOn(Schedulers.io()) .debounce(200, TimeUnit.MILLISECO

我在当前的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不能删除重复的字符串

例如,当我在搜索文本中键入“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()
,它只是过滤掉与上次发出的值的非唯一匹配。

片段或活动?您以什么方式进行此订阅?一次创建?开始?onViewCreated?它位于一个片段中,即onViewCreated。我在哪里设置这个有什么区别?除了distinct()没有任何效果外,其他一切都按要求工作@d370urn3urGood spot,我确实绑定了多次搜索编辑文本。现在,我只有在我的重复问题得到解决后才具有约束力。我注意到的一件事是,一旦.distinct()和.distinctUntilChanged()按要求运行,我生成了许多“Choreographer:跳过了53帧!应用程序可能在其主线程上做了太多的工作。”尽管我有.subscribeOn(Schedulers.computation())@d370urn3ur,但还是出现了警告事件