我们有搜索栏的窗口。每次用户输入内容时都会执行搜索。
搜索事件已转换为数据流。
在每次新搜索中,我们都需要启动异步网络操作并关闭之前的操作。如何归档此效果?
Edit1:这是我尝试过的。它执行所有可观察的!不是唯一的最后一个,哪里是错误的?
PublishSubject<Integer> subject = PublishSubject.create();
subject.switchMap(integer -> Observable.fromCallable(() -> {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "-" + integer + "-";
})).subscribe(s -> System.out.print(s));
for (int i = 0; i < 30; i++) subject.onNext(i);
答案 0 :(得分:3)
将PublishSubject
与switchMap
:
PublishSubject<String> subject = PublishSubject.create();
subject
.switchMap(
x -> networkOperationObservable(x)
.subscribeOn(Schedulers.io))
.subscribe(subscriber);
要充分利用此networkOperationObservable
,我们会对unsubscribe
电话做出明智的回应(如关闭Socket
或其他)。 Observable.using
通常是首选工具。
答案 1 :(得分:0)
PublishSubject
正是您所需要的。您可以随时添加活动Observable
。
创建它:
private Subject<String, String> filteringSubject = PublishSubject.create();
然后使用Observable.throttleWithTimeout()
运算符:
Subscriber<String> filteringSubscriber = new DefaultSubscriber<>();
filteringSubject
.throttleWithTimeout(250, TimeUnit.MILLISECONDS)
.doOnNext(new Action1<String>() {
@Override
public void call(String text) {
//make a network call
}
})
.subscribe(filteringSubscriber);
用法:
filteringSubject.onNext(text);