再次订阅后,RxJava继续发出

时间:2017-06-07 13:46:30

标签: android rx-java

我正在努力使用Socket.io实现RxJava。我有一个问题,再次订阅相同的observable,所以我做了一个例子和更清晰的代码来理解。

这是功能:

private void testObservable() throws InterruptedException {
    io.reactivex.Observable observable = io.reactivex.Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(ObservableEmitter e) throws Exception {
            for (int i = 0; i < 20; i++) {
                java.lang.Thread.sleep(100);
                e.onNext(i);
                Timber.d("TESTOBSERVER emit %d", i);
            }
            e.onComplete();
        }
    });
    DisposableObserver observer = new DisposableObserver<Integer>() {
        @Override
        public void onNext(Integer value) {
            Timber.d("TESTOBSERVER observed: %d", value);
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {

        }
    };
    observable.subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(observer);
    Timber.d("TESTOBSERVER subscribe 1");

    java.lang.Thread.sleep(500);
    observer.dispose();

    Timber.d("TESTOBSERVER dispose 1");

    java.lang.Thread.sleep(500);
    observable.subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(observer);
    Timber.d("TESTOBSERVER subscribe 2");
    java.lang.Thread.sleep(500);
    observer.dispose();
    Timber.d("TESTOBSERVER dispose 2");
}

这是打印的内容

06-07 15:02:49.851 12649-12649/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER subscribe 1
06-07 15:02:49.951 12649-12840/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER emit 0
06-07 15:02:50.051 12649-12840/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER emit 1
06-07 15:02:50.161 12649-12840/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER emit 2
06-07 15:02:50.261 12649-12840/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER emit 3
06-07 15:02:50.351 12649-12649/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER dispose 1
06-07 15:02:50.861 12649-12649/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER subscribe 2
06-07 15:02:51.361 12649-12649/com.skunkaga.Skunkaga D/ThreadListPresenter: TESTOBSERVER dispose 2

我有两个问题:

  1. 为何不打印TESTOBSERVER observed: 1
  2. 为什么在第二次订阅之后它不会继续发出9,10,11,12,13?

1 个答案:

答案 0 :(得分:2)

  
      
  1. 为什么它没有打印出TESTOBSERVER观察到:1?
  2.   

大概是因为testObservable()正在android主线程上执行。因此,在取消之前,永远不可能使用AndroidSchedulers.mainThread()来观察值。

  
      
  1. 为什么在第二次订阅之后它还没有继续发出9,10,11,12,13?
  2.   

因为Observables不是有状态的。每个.subscribe()电话都独立于其他所有电话。 它不发出任何内容的原因是因为Observer无法重复使用。因此,由于它已经订阅和处理,因此它不会订阅可观察的内容。