當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。