Android, RXJava, поиск с использованием debounce

Я использую debounce() для обработки пользовательского поиска и работы с паузой при наборе текста (поиск через 1 секунду после последнего символа):

RxSearchView.queryTextChanges(searchView)
            .debounce(1, TimeUnit.SECONDS)
            .subscribe(new Action1<CharSequence>() {
                @Override
                public void call(CharSequence charSequence) {
                    presenter.loadUsers(charSequence.toString());
                }
            });

поэтому, если пользователь удаляет все символы, он ждет 1 секунду, а затем загружает список, как я могу справиться с этим и мгновенно загрузить список?


person Alireza Akbari    schedule 04.10.2016    source источник


Ответы (2)


В вашем случае нужен только debounce оператор с разными параметрами:

public final <U> Observable<T> debounce(Func1<? super T, ? extends Observable<U>> debounceSelector)

С его помощью вы можете фильтровать, какие события могут быть задержаны или нет:

RxSearchView.queryTextChanges(searchView)  
    .debounce(new Func1<CharSequence, Observable<CharSequence>>() {
        @Override
        public Observable<CharSequence> call(CharSequence charSequence) {
            if (charSequence.length() == 0) {
                return Observable.empty();
            } else {
                return Observable.<CharSequence>empty().delay(1, TimeUnit.SECONDS);
            }
        }
    })
    .subscribe(new Action1<CharSequence>() {
        @Override
        public void call(CharSequence charSequence) {
            Log.d(MainActivity.class.getSimpleName(), new Date().toGMTString() + " " + charSequence.length() + " :" + charSequence);
        }
    });
person R. Zagórski    schedule 04.10.2016
comment
Возможно, вы захотите использовать Observable.empty() вместо Observable.just(charSequence) в функции устранения дребезга. Он должен быть более эффективным. - person JohnWowUs; 04.10.2016

В простейшей форме просто объединить обнаруженный наблюдаемый объект с ручным триггером вот так:

RxSearchView.queryTextChanges(searchView)
        .debounce(1, TimeUnit.SECONDS)
        .mergeWith(Observable.just("")) // manually tigger onNext with empty search
        .subscribe(new Action1<CharSequence>() {
            @Override
            public void call(CharSequence charSequence) {
                presenter.loadUsers(charSequence.toString());
            }
        });
person miensol    schedule 04.10.2016