1. 程式人生 > >Rxjava2的操作符Filter、Debounce 、DistinctUntilChanged 、SwitchMap 的使用

Rxjava2的操作符Filter、Debounce 、DistinctUntilChanged 、SwitchMap 的使用

public class RxSearchObservable {
    public static Observable<String> fromView(SearchView searchView) {
        final PublishSubject<String> subject = PublishSubject.create();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            
public boolean onQueryTextSubmit(String s) { subject.onComplete(); return true; } @Override public boolean onQueryTextChange(String text) { subject.onNext(text); return true; } });
return subject; } } RxSearchObservable.fromView(searchView) .debounce(300, TimeUnit.MILLISECONDS)  //時間跨度300毫秒以上才觸發 .filter(new Predicate<String>() {    //過濾,下面的test是過濾條件 @Override public boolean test(String text) throws Exception {
if (text.isEmpty()) { return false; } else { return true; } } }) .distinctUntilChanged()        //去重,比如一開始是abc,使用者在300毫秒內刪除c再輸入c,300毫秒後也不會重新再次觸發。 .switchMap(new Function<String, ObservableSource<String>>() {  //只取最新的結果,比如請求ab很久了還沒回來又請求了abc,只取最後的abc的結果。 @Override public ObservableSource<String> apply(String query) throws Exception { return dataFromNetwork(query); } }) .subscribeOn(Schedulers.io())  //io耗時操作子執行緒 .observeOn(AndroidSchedulers.mainThread())  //ui更新執行緒 .subscribe(new Consumer<String>() { @Override public void accept(String result) throws Exception { textViewResult.setText(result); } });