Rx SearchView 需要取消优先级较低的正在进行的请求

Rx SearchView needs to cancel on going request with less priority

我正在使用

RxSearchView.queryTextChangeEvents

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

我现在有 2 个问题。

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

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

如何使用此代码实现此目的?

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

这是我正在使用的代码。

 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) {

                    }

                });
    }

您可能想尝试 switchMap,它只使用来自 observable 的最后一个发射值。

来自文档:

Returns a new Observable by applying a function that you supply to each item emitted by the source Observable that returns an Observable, and then emitting the items emitted by the most recently emitted of these Observables. The resulting Observable completes if both the upstream Observable and the last inner Observable, if any, complete. If the upstream Observable signals an onError, the inner Observable is unsubscribed and the error delivered in-sequence.