RxJava一次只执行一个Observable

时间:2016-11-04 14:22:41

标签: java rx-java

我们有搜索栏的窗口。每次用户输入内容时都会执行搜索。

  1. 搜索事件已转换为数据流。

  2. 在每次新搜索中,我们都需要启动异步网络操作并关闭之前的操作。如何归档此效果?

  3. 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);
    

2 个答案:

答案 0 :(得分:3)

PublishSubjectswitchMap

一起使用
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);