gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:58:13 31 4
gpt4 key购买 nike

我在当前的 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 中,所以也许你正在加载另一个 fragment 然后返回到这个 fragment 而不处理第一个订阅?您可以在进行订阅的地方放置一个断点,以查看它是否被调用两次。如果它只被调用一次而你仍然有这个问题,我将需要查看更多你的代码来诊断它。

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

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

关于android - 如何使用 RxBinding RxTextView.textChangeEvents 处理不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53046883/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com