1. 需求场景

ccf6a3ba06e8e955ce27f369b22a90d8.png

2. API说明

(1) debonuce

f67f9ae90c053e7a490c938016946b0a.png

仅在过了一段指定的时间还没发射数据时才发射一个数据,会过滤掉发射速率过快的数据项

(2) Skip

10bdf2aabac85dfd00e36f94d38f5bea.png

Observable’发射的前N项数据,只保留之后的数据。

(3) switchMap

4428faa8e4312785e8e3947f1bb0d6e0.png

最新发射的最终显示

(4)filter

2f97ce18e3e082070107209019ca4dbe.png

只有通过测试的数据才会被发射

(5)map:

cf4b082b91e802f0f3bacbd9831dbcda.png

将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的Observable

3. 具体实现

依赖:

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

compile 'io.reactivex.rxjava2:rxjava:2.1.8'

compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'

(1)xml

(2)核心代码实现

RxTextView.textChanges(et) //绑定EditText

.skip(1)//去掉第一次选中

.debounce(300, TimeUnit.MILLISECONDS);

.switchMap(new Function>>() {

@Override

public ObservableSource> apply(final CharSequence charSequence) throws Exception {

return searchService.getSearchResults(charSequence.toString());

}

})

.observeOn(AndroidSchedulers.mainThread())

.subscribeWith(observer);

//searchService.getSearchResults是一个网络请求

(3)效果图:

a94b1c84cd95cc28daebdacac1a90f31.gif

4. 提升优化:同时支持定向搜索和模糊搜索

flatMap实现不同输入串,发送不同请求,将所有请求的返回结果,封装到一个Bean中,根据不同的code,显示不同效果

主要代码:

RxTextView.textChanges(et) //绑定EditText

.skip(1)//去掉第一次选中

.debounce(300, TimeUnit.MILLISECONDS);//300毫秒防反跳

.flatMap(new Function>() {

@Override

public ObservableSource apply(CharSequence charSequence) throws Exception {

//字符为空

if (TextUtils.isEmpty(charSequence)) {

return Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

if (!emitter.isDisposed()) {

SearchResultPackage resultPackage = new SearchResultPackage();

resultPackage.code = 0;

emitter.onNext(resultPackage);

emitter.onComplete();

}

}

});

}

//定向输入

if (charSequence.length() == 6) {

return searchService.getDetailResults(charSequence.toString());

}

//普通搜索

return searchService.getSearchResults(charSequence.toString());

}

})

.observeOn(AndroidSchedulers.mainThread())

.subscribeWith(observer);

效果图:

d01d010665144498f6c4b1e618a6638d.gif

5. Demo地址

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐