0

我在用

RxSearchView.queryTextChangeEvents

检测“键入时搜索”的事件以及当您提交搜索时,SAYT 会获取建议,当您提交时,它会执行完整搜索。

我目前有两个问题。

当您输入并获取建议时,突然您单击提交,然后它会执行完整搜索,但问题是,如果有一个正在进行的建议请求,可能会出现它们不应该作为完整搜索出现在屏幕上的情况搜索优先。

所以我想取消(取消订阅)建议中的请求,以防在完整搜索中有提交。

我怎样才能用这段代码实现这一点?

另一个问题是,当我在搜索视图中删除搜索词并且它变空时,它会清除适配器,但在某些情况下,当我清除搜索文本时,仍然有一个正在进行的建议请求,它会设置结果但是它很清楚,所以我想保证如果用户清除搜索视图,它会取消所有请求。

这是我正在使用的代码。

 RxSearchView.queryTextChangeEvents(searchView)
                .skip(1)
                .throttleLast(100, TimeUnit.MILLISECONDS)
                .debounce(200, TimeUnit.MILLISECONDS)
                .onBackpressureLatest()
                .observeOn(AndroidSchedulers.mainThread())
                .filter(new Func1<SearchViewQueryTextEvent, Boolean>() {
                    @Override
                    public Boolean call(SearchViewQueryTextEvent searchViewQueryTextEvent) {
                        final boolean empty = TextUtils.isEmpty(searchViewQueryTextEvent.queryText());
                        if (empty) {
                            //Dont show anything  clear adapter
                            clearAdapter();
                        }
                        return !empty;
                    }
                })
                .concatMap(new Func1<SearchViewQueryTextEvent, Observable<Object>>() {
                    @Override
                    public Observable<Object> call(SearchViewQueryTextEvent searchViewQueryTextEvent) {

                        String searchTerm = searchViewQueryTextEvent.queryText().toString();
                        boolean submitted = searchViewQueryTextEvent.isSubmitted();
                        //Hide RecyclerView
                        //Show loading indicator
                        showLoading();
                        Observable<Object> observable;
                        if (submitted) {
                            observable = getFullSearch(searchTerm);
                        } else {
                            observable = getSuggestionsSearch(searchTerm);
                        }
                        return observable
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .doOnCompleted(new Action0() {
                                    @Override
                                    public void call() {
                                        //Show RecyclerView
                                        //Hide loading indicator
                                        showContent();
                                    }
                                });
                    }
                })
                .subscribe(new Subscriber<Object>() {
                    @Override
                    public void onNext(Object object) {
                        //Set data on recyclerview and notify change.
                        setData(object);
                    }

                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                });
    }
4

1 回答 1

2

您可能想尝试一下switchMap,它只使用 observable 中最后发出的值。

从文档:

通过将您提供的函数应用于返回 Observable 的源 Observable 发射的每个项目,然后发射这些 Observable 中最近发射的项目,从而返回一个新的 Observable。如果上游 Observable 和最后一个内部 Observable(如果有)都完成,则生成的 Observable 完成。如果上游 Observable 发出 onError 信号,则内部 Observable 被取消订阅,错误按顺序传递。

在此处输入图像描述

于 2016-12-05T13:48:28.470 回答