应用中实时搜索,一般我们会优化为当用户快速搜索的时候,我们不进行网络请求,当输入完毕后有个几百毫秒停顿后,才进行实时搜索,在使用Rxjava之前,我们大多数都是使用handle来postDelay,当在用户输入的时候,将任务cancle,但是,用过Rxjava才知道,是真的方便。
直接贴代码,部分操作符的使用方式,我后面会再集中解释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 Observable.create((ObservableOnSubscribe<String>) e -> etSearch.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged (CharSequence s, int start, int count, int after) { } @Override public void onTextChanged (CharSequence s, int start, int before, int count) { e.onNext(s.toString()); } @Override public void afterTextChanged (Editable s) { } })).debounce(500 , TimeUnit.MILLISECONDS) .subscribeOn(SchedulerProvider.getInstance().ui()) .filter(s -> !TextUtils.isEmpty(s)) .observeOn(SchedulerProvider.getInstance().newThread()) .switchMap((Function<String, ObservableSource<ResponseData<SpecialListModel>>>) s -> { LogUtil.e(TAG, "搜索内容==" + s); return Http.getAPIService(CoreUtil.getContext()).specialList(); }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<ResponseData<SpecialListModel>>() { @Override public void onSubscribe (Disposable d) { addDisposable(d); LogUtil.logeThread(TAG, "onSubscribe" ); } @Override public void onNext (ResponseData<SpecialList> responseData) { LogUtil.logeThread(TAG, "onNext" ); LogUtil.e(TAG, "数据=" + responseData.toString()); } @Override public void onError (Throwable e) { LogUtil.logeThread(TAG, "onError" ); } @Override public void onComplete () { LogUtil.logeThread(TAG, "onComplete" ); } });
这里大家需要关心以下几个操作符的使用方法
debounce
switchMap(和flatMap的区别)