我试图实现 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;
答案 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());
});
这不再执行主线程上的doOnSubscibe
和doOnNext
中的代码,只有subscribe
处理程序在主线程上执行。