为什么这总是在主线程上运行?

时间:2017-07-26 10:22:42

标签: java android rx-java2

我试图实现 RxAndroid2 的一个非常简单的例子。当我尝试运行此代码时,它让我感到困惑。




  ArrayList< Integer> arr = new ArrayList<>();
 arr.add(0);
 arr.add(1);
 arr.add(2);
 arr.add(3);
 arr.add(4);
 arr.add(5);
 arr.add(6);

 Observable.fromIterable(ARR)
 .subscribeOn(Schedulers.newThread())
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(new Observer< Integer>(){
 @Override
 public void onSubscribe(Disposable d){
 LogUtil.logD(TAG,Thread.currentThread(。getName());& #xA;}

 @覆盖
 public void onNext(整数整数){
 LogUtil.logD(TAG,Thread.currentThread()。getName());
 }

 @覆盖
 public void onError(Throwable e){
 LogUtil.logD(TAG,Thread.currentThread()。getName());
}&# xA;
 @覆盖
 public void onComplete(){
 LogUtil.logD(TAG,Thread.currentThread()。getName());
}
}); 
  




日志总是告诉我它只在 main 线程上运行。 
围绕这个想法?如果你能解释一下有关observeOn()和subscribeOn()的更多信息,那将是非常好的。





EDITED :这段代码仍然给了我所有主线程。




  ArrayList< Integer> arr = new ArrayList<>();
 arr.add(0);
 arr.add(1);
 arr.add(2);
 arr.add(3);
 arr.add(4);
 arr.add(5);
 arr.add(6);

 Observable.fromIterable(ARR)
 .subscribeOn(Schedulers.newThread())
 .observeOn(AndroidSchedulers.mainThread())
 .doOnSubscribe(new Consumer< Disposable>(){
 @Override
 public void accept(Disposable disposable)抛出异常{
 LogUtil.logD(TAG,Thread.currentThread()。getName()) ;
}
})
 .doOnNext(new Consumer< Integer>(){
 @Override
 public void accept(整数整数)抛出异常{
 LogUtil.logD(TAG,Thread.currentThread()。getName()) ;
}
})
 .subscribe(整数 - > {
 LogUtil.logD(TAG,Thread.currentThread()。getName());
});
  
&# XA;

2 个答案:

答案 0 :(得分:4)

您有observeOn(AndroidSchedulers.mainThread())

observeOn()的{​​{3}}明确指出:

  

修改ObservableSource以在指定的调度程序上执行其发射和通知,与具有Flowable.bufferSize()"岛大小"的无界缓冲区异步。

那么为什么你对主线程上发生的事情感到惊讶?!

只是要明确这一点:你的代码将Observable配置为使用主线程。

进一步了解相关的API,我猜测你必须在调度程序上调用javadoc,例如:

Scheduler newThreadScheduler = Schedulers.newThread();
newThreadScheduler.start();
Observable.fromIterable(arr)
        .subscribeOn(newThreadScheduler)
        .observeOn(newThreadScheduler)

答案 1 :(得分:2)

您可以移动运营商:

Observable.fromIterable(arr)
        .subscribeOn(Schedulers.newThread())
                                                      // <------------------------
        .doOnSubscribe(new Consumer<Disposable>() {
            @Override
            public void accept(Disposable disposable) throws Exception {
                LogUtil.logD(TAG, Thread.currentThread().getName());
            }
        })
        .doOnNext(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                LogUtil.logD(TAG, Thread.currentThread().getName());
            }
        })
        .observeOn(AndroidSchedulers.mainThread())  // <--------------------------
        .subscribe(integer -> {
            LogUtil.logD(TAG, Thread.currentThread().getName());
        });

这不再执行主线程上的doOnSubscibedoOnNext中的代码,只有subscribe处理程序在主线程上执行。