等到用户停止输入后再在 searchview 中执行大量搜索

Vic*_*c V 5 android android-view searchview rx-java rx-java2

搜索是我的应用程序的核心,我需要它才能正常工作。现在我有一个SearchView。我需要内联显示结果,因此我使用此代码。

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            srl.setVisibility(View.GONE);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            currentQuery = query;
            if (query.length()>= 3) {
                searchFor(currentQuery);
            } else {
                srl.setVisibility(View.GONE);
            }
            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

问题可能很明显。因为我使用 firebase,我的searchFor()函数相当重,我不需要对每个字母都执行它。这不仅会破坏用户体验,如果您写下较长的单词,有时还会使我的应用程序崩溃。

我想要的是当用户停止打字时进行搜索。我想我需要一个处理程序,将其延迟一秒,然后每次按下字母键时取消该处理程序并设置一个新的处理程序。这在理论上是有道理的。我只是无法自己为 searchView 实现这一点。

帮助将不胜感激!

azi*_*ian 5

实现这一点的最简单方法是RxJava 的 debounce运算符。

在此输入图像描述

结合 Jake Wharton 的RxBinding,您最终会得到如下结果:

RxSearchView.queryTextChanges(searchView)
        .debounce(1, TimeUnit.SECONDS) // stream will go down after 1 second inactivity of user
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<CharSequence>() {
            @Override
            public void accept(@NonNull CharSequence charSequence) throws Exception {
                // perform necessary operation with `charSequence`
            }
        });
Run Code Online (Sandbox Code Playgroud)