2016-10-04 67 views
1

搜索我使用debounce()處理用戶的搜索和(最後一個字符後,搜索1秒)上鍵入它的暫停處理:的Android,RXJava,使用去抖

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

因此,如果用戶刪除所有字符,它等待1秒鐘,然後加載列表,我如何處理它並立即加載列表?

回答

3

在你的情況下,需要只是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); 
     } 
    }); 
+0

您可能想在debounce函數中使用'Observable.empty()'而不是'Observable.just(charSequence)'。它應該更有效率。 – JohnWowUs

1

在最簡單的形式只是merge去抖觀察到有手動觸發像這樣:

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()); 
      } 
     }); 
+1

謝謝,但沒有** **爲我工作! – AlirezaXX