Android rx subscribeOn';你不能和这个主题打交道吗?

Android rx subscribeOn';你不能和这个主题打交道吗?,android,multithreading,system.reactive,Android,Multithreading,System.reactive,代码如下: Observable<Integer> observable = Observable.just(1, 2); observable.doOnNext(i -> System.out.println("Emitting " + i + " on thread " + Thread.currentThread().getName())) .subscribeOn(Schedulers.computation()) .doOnNe

代码如下:

Observable<Integer> observable = Observable.just(1, 2);
observable.doOnNext(i -> System.out.println("Emitting " + i + " on thread " + Thread.currentThread().getName()))
          .subscribeOn(Schedulers.computation())
          .doOnNext(i -> System.out.println("Emitting " + i + " after subscribeOn" + " on thread " + Thread.currentThread().getName()))
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(i -> System.out.println( "Receiving " + i + " on thread " + Thread.currentThread().getName()));
一切都好

现在我想对主题做同样的事情,我对代码做了如下更改:

PublishSubject<Integer> subject = PublishSubject.create();

subject.doOnNext(i -> System.out.println("Emitting " + i + " on thread " + Thread.currentThread().getName()))
       .subscribeOn(Schedulers.computation())
       .doOnNext(i -> System.out.println("Emitting " + i + " after subscribeOn" + " on thread " + Thread.currentThread().getName()))
       .observeOn(AndroidSchedulers.mainThread())
       .subscribe(i -> System.out.println( "Receiving " + i + " on thread " + Thread.currentThread().getName()));

subject.onNext(1);
PublishSubject=PublishSubject.create();
subject.doOnNext(i->System.out.println(“在线程+thread.currentThread().getName()上发出+i+))
.subscribeOn(Schedulers.computation())
.doOnNext(i->System.out.println(“在线程上的“+”上发出“+i+”)+thread.currentThread().getName()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(i->System.out.println(“在线程+thread.currentThread().getName()上接收”+i+);
主题.onNext(1);
在这种情况下,我没有得到任何输出。为什么会这样?如何在给定的调度程序中强制主题发出流?

决定是:

PublishSubject<Integer> subject = PublishSubject.create();
subject
      **.observeOn(Schedulers.computation())**
      .doOnNext(i -> System.out.println("Emitting " + i + " on thread " + Thread.currentThread().getName()))                    
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(i -> System.out.println( "Receiving " + i + " on thread " + Thread.currentThread().getName()));

subject.onNext(1);
PublishSubject=PublishSubject.create();
主题
**.observeOn(Schedulers.computation())**
.doOnNext(i->System.out.println(“在线程+thread.currentThread().getName()上发出+i+))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(i->System.out.println(“在线程+thread.currentThread().getName()上接收”+i+);
主题.onNext(1);
或者您可以从调度器调用subject.onNext(1)。computation()线程的决定是:

PublishSubject<Integer> subject = PublishSubject.create();
subject
      **.observeOn(Schedulers.computation())**
      .doOnNext(i -> System.out.println("Emitting " + i + " on thread " + Thread.currentThread().getName()))                    
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(i -> System.out.println( "Receiving " + i + " on thread " + Thread.currentThread().getName()));

subject.onNext(1);
PublishSubject=PublishSubject.create();
主题
**.observeOn(Schedulers.computation())**
.doOnNext(i->System.out.println(“在线程+thread.currentThread().getName()上发出+i+))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(i->System.out.println(“在线程+thread.currentThread().getName()上接收”+i+);
主题.onNext(1);

或者你可以从Schedulers.computation()线程调用subject.onNext(1)

如果RxJava仍然类似于Rx.NET,那么
.subscribeOn
在与主题一起使用时将没有任何效果。i、 e.订阅或订阅时运行的代码没有成本。但是,如果订阅时您的可观察序列执行了一些I/O操作,并且您希望在另一个线程上执行这些操作(以防止阻塞GUI),那么
subscribeOn
将非常有用,并且您不会使用主题。是的,但我想使用主题,因为它需要开始从我的应用程序的不同部分发出序列。使用subject会比使用Observable更简单。如果RxJava仍然像Rx.NET一样,那么
.subscribeOn
与subject一起使用时将没有任何效果。i、 e.订阅或订阅时运行的代码没有成本。但是,如果订阅时您的可观察序列执行了一些I/O操作,并且您希望在另一个线程上执行这些操作(以防止阻塞GUI),那么
subscribeOn
将非常有用,并且您不会使用主题。是的,但我想使用主题,因为它需要开始从我的应用程序的不同部分发出序列。让主体做这件事比使用可观察的更简单。