利用rxjava實現監聽EditView裏的文字在規定時間間隔不變後進行聯想搜索

當EditView輸入的內容變化停止幾秒鐘之後再去後進行搜索,

debounce:防抖
當一個事件發送出來之後,在約定時間內沒有再次發送這個事件,則發射這個事件,如果再次觸發了,則重新計算時間。

switchMap :當源Observable發射一個新的數據項時,如果舊數據項訂閱還未完成,就取消舊訂閱數據和停止監視那個數據項產生的Observable,開始監視新的數據項。如果都是在同一個線程裏跑的話,那麼該操作符與ContactMap無異;只有在不同的線程裏跑的時候,即線程方案爲newThread的時候,纔會出現這種情況。
subscription = RxTextView.textChanges(etKey)
                .debounce(400, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
                .subscribeOn(AndroidSchedulers.mainThread())
                //對用戶輸入的關鍵字進行過濾
                .filter(new Func1<CharSequence, Boolean>() {
                    @Override
                    public Boolean call(CharSequence charSequence) {
                        return charSequence.toString().trim().length() > 0;
                    }
                })
                .switchMap(new Func1<CharSequence, Observable<List<String>>>() {
                    @Override
                    public Observable<List<String>> call(CharSequence charSequence) {
                        return presenter.search(charSequence.toString());
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<List<String>>() {
                    @Override
                    public void call(List<String> strings) {                      
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                    }
                });

  • 使用debounce操作符設置: 只有當用戶輸入關鍵字後400毫秒才發射數據[說的直白點就是400毫秒後纔會走後面的邏輯];
  • 使用filter操作符 對用戶輸入的關鍵字進行過濾:只有輸入的關鍵字不爲空,纔會走後面的邏輯;
  • 使用switchtMap操作符:使用最終的關鍵字去請求搜索接口,並且只會發射最近的Observables。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章