Дождитесь, пока пользователь перестанет печатать, прежде чем выполнять интенсивный поиск в searchview


Поиск занимает центральное место в моем приложении, и мне нужно, чтобы он хорошо работал. Прямо сейчас у меня есть 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;
        }
    });

Проблема может быть очевидной. Поскольку я использую firebase, моя функция searchFor() довольно тяжелая, и мне не нужно, чтобы она выполнялась для каждой буквы. Это не только разрушает пользовательский опыт, но иногда буквально выводит из строя мое приложение, если вы записываете более длинные слова.

Я хочу искать, когда пользователь останавливается. напечатать. Я думаю, что мне нужен обработчик, который задерживает его на секунду, а затем отменяет этот обработчик каждый раз, когда нажимается буквенная клавиша, и устанавливает новый. Теоретически это имеет смысл. Я просто не смог сделать это сам для поискового обзора.

Помощь была бы признательна!

1 2

1 ответ:

Самый простой способ достичь этого-это RxJava оператор debounce .

Введите описание изображения здесь

С комбинацией Джейка Уортона 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`
            }
        });