如何在RxJava2中使用带有lambda表达式的DisposableObserver

时间:2017-04-18 11:18:00

标签: android lambda rx-java rx-android rx-java2

我的用例是想在我的onNext中的某个条件之后处理。所以尝试使用DisposableObserver。这是可行的代码

Observable.just(1, 2, 3, 4)
    .subscribe(new DisposableObserver<Integer>() {
                     @Override
                     public void onNext(Integer integer) {
                       System.out.println("onNext() received: " + integer);
                       if (integer == 2) {
                         dispose();
                       }
                     }
                     @Override
                     public void onError(Throwable e) { System.out.println("onError()"); }
                     @Override
                     public void onComplete() { System.out.println("onComplete()"); }
                   }
    );

现在,如果您尝试将其替换为lambda,则将lambda视为

subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError,Action onComplete)

现在这样做。通过从onSubscribe保存一次性用品,然后调用disposable.dispose();来自onNext。

  private Disposable disposable;
  private void disposableObserverTest() {
    Observable.just(1, 2, 3, 4)
        .subscribe(integer -> {
              System.out.println("onNext() received: " + integer);
              if (integer == 2) {
                disposable.dispose();
              }

            }, throwable -> System.out.println("error"),
            () -> System.out.println("complete"),
            disposable1 -> {
              this.disposable = disposable1;
            });
  }

但是,如果你想直接调用dispose()如何用lambdas做什么?

2 个答案:

答案 0 :(得分:4)

你可以使用takeUntil来关闭observable。

@Test
public void takeUntil() throws Exception {
    Observable.just(1, 2, 3, 4)
            .takeUntil(integer -> integer == 2)
            .test()
            .assertValues(1, 2);
}

答案 1 :(得分:3)

这是因为在第一种情况下你打电话

subscribe(DisposableObserver observer)

而在第二种情况下你打电话

subscribe(Action1<? extends Integer> onNext, Action1<? extends Throwable> onError, Action0 onComplete)

这意味着在第二种情况下,您不能引用DisposableObserver,因此您无法在其上调用dispose()