android - 如何使用 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
我究竟做错了什么?
解决方案
如果没有更多上下文,我无法确定,但似乎订阅已经进行了两次。你说你把这段代码放进去Fragment::onViewCreated
,所以也许你正在加载另一个片段,然后在不处理第一个订阅的情况下回到这个片段?您可以在订阅的位置放置一个断点,以查看它是否被调用了两次。如果它只被调用一次并且您仍然遇到此问题,我将需要查看更多代码来诊断它。
当我将您的代码复制到 Activity::onCreate 时,它按预期工作。所以你可以做的第一件事是确保你在 Fragment::onDestroyView 中处理你的compositeDisposable。这应该可以解决多重排放问题。
现在您将遇到另一个问题:您正在使用distinct()
,但我怀疑这就是您想要从搜索栏中获得的。Distinct 将在可观察对象的生命周期内过滤所有非唯一值。所以一旦它发出了“chile”,如果你继续输入“chilean”然后删除“an”,你就再也看不到“chile”了。您可能想要的是distinctUntilChanged()
,它只是过滤掉与 LAST 发出的值的非唯一匹配项。
推荐阅读
- c - 使用 fgetc() 时,分配的变量给出 EOF
- javascript - 在 IE 本机模式下 insertbefore(documentfragment,null) 不起作用,文档片段未定义
- amazon-web-services - 在 AWS Amplify 控制台上部署 Nuxtjs
- mysql - MySQL按最低排序和分组
- java - 在java中的json文件中读取json对象数组的属性
- css - 动画 linkBorderHover 不适用于 ::after / ::before 元素?
- java - 根据坐标占位符替换 PDF 中的字符串/行并使用 java 重新对齐 PDF 的内容
- ios - 使用 PHImageManager 时,PHAsset 返回 UIImage 的 nil 值
- python - 如何将 cumcount 应用于两列?
- c# - 如何在瓷砖地图中动态设置瓷砖?