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