为什么Schedulers.io()有时在mainthread中运行?

时间:2016-04-28 06:32:29

标签: android rx-java rx-android

我自己使用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) {
            }
        });

2 个答案:

答案 0 :(得分:0)

.subscribeOn - 在哪里接听答案 .observeOn -where carry

.subscribeOn(AndroidSchedulers.mainThread())

答案 1 :(得分:0)

是的,这是预期的行为。

永远记住这个拇指规则,

  

subscribeOn()总是影响它上游的运算符和observerOn()   总是影响它下游的运营商。

因此,当您将subscribeOn()移到zip()以下时,它会使Schedulers.io()上游运行。

您还应该使用observeOn()来观察主线程上的结果,并在需要时对UI进行更改。