Rxjava2的操作符Filter、Debounce 、DistinctUntilChanged 、SwitchMap 的使用
阿新 • • 發佈:2019-01-06
public class RxSearchObservable { public static Observable<String> fromView(SearchView searchView) { final PublishSubject<String> subject = PublishSubject.create(); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Overridepublic 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); } });