Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android, RXJava, search using debounce

I'm using debounce() for handling user searching and dealing with it's pause on typing (searches 1 second after the last char):

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

so if user delete all chars, it waits 1 second and then loads the list, how can I handle it and load the list instantly?

like image 584
Alireza Akbari Avatar asked Oct 11 '25 18:10

Alireza Akbari


2 Answers

In your case just debounce operator with different parameters is needed:

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

Using it you can filter, which events can be delayed or not:

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);
        }
    });
like image 124
R. Zagórski Avatar answered Oct 14 '25 11:10

R. Zagórski


In the simplest form just merge the debounced observable with a manual trigger like so:

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());
            }
        });
like image 20
miensol Avatar answered Oct 14 '25 13:10

miensol