Rxjava优化实时搜索

应用中实时搜索,一般我们会优化为当用户快速搜索的时候,我们不进行网络请求,当输入完毕后有个几百毫秒停顿后,才进行实时搜索,在使用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)//延迟500毫秒
//edittext监听mainThread
.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();
})
//刷新-Ui线程
.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的区别)

文章目录