我自己使用RxAndroid而不是线程。 我在io线程上订阅了它,但它有时在主线程中运行。 有时日志是在主线程中打印的。
Observable.from(bitmaps.toArray(new Bitmap[0]))
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.zipWith(Observable.range(0, bitmaps.size()), new Func2<Bitmap, Integer, Boolean>() {
@Override
public Boolean call(Bitmap bitmap, Integer i) {
Log.i("==", "" + i);
return true;
}
})
.last()
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean aBoolean) {
}
});
logcat中的两个线程:
04-28 14:33:14.696 7215-23795/ Thread: RxCachedThreadScheduler-1
04-28 14:33:19.811 7215-7215/ Thread: main
解决方案: 我在zipWith()之后移动subscribeOn()并运行正常。
Observable.from(bitmaps.toArray(new Bitmap[0]))
.zipWith(Observable.range(0, bitmaps.size()), new Func2<Bitmap, Integer, Boolean>() {
@Override
public Boolean call(Bitmap bitmap, Integer i) {
Log.i("==", "" + i);
return true;
}
}).subscribeOn(Schedulers.io())
.last()
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean aBoolean) {
}
});
答案 0 :(得分:0)
.subscribeOn - 在哪里接听答案 .observeOn -where carry
.subscribeOn(AndroidSchedulers.mainThread())
答案 1 :(得分:0)
是的,这是预期的行为。
永远记住这个拇指规则,
subscribeOn()总是影响它上游的运算符和observerOn() 总是影响它下游的运营商。
因此,当您将subscribeOn()
移到zip()
以下时,它会使Schedulers.io()
上游运行。
您还应该使用observeOn()来观察主线程上的结果,并在需要时对UI进行更改。