RxJava执行混乱的顺序,主题需要

时间:2017-11-01 16:54:13

标签: rx-java rx-java2

我有这个非常简单的RxJava示例

List<Integer> arrayIntegers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

Observable.fromIterable(arrayIntegers).map(i -> {
    Log.d("RxJava", "map i = " + i);
    return i;
}).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).
subscribe(new DisposableObserver<Integer>() {
    @Override
    public void onNext(Integer i) {
        Log.d("RxJava", "next i = " + i);
    }

    @Override
    public void onError(Throwable e) {}

    @Override
    public void onComplete() {
        Log.d("RxJava", "Completed");
    }
});

这给出了这个结果..

D/RxJava: map i = 1
D/RxJava: map i = 2
D/RxJava: map i = 3
D/RxJava: map i = 4
D/RxJava: map i = 5
D/RxJava: next i = 1
D/RxJava: next i = 2
D/RxJava: next i = 3
D/RxJava: next i = 4
D/RxJava: next i = 5

我期待的是更像这样的东西

D/RxJava: map i = 1
D/RxJava: next i = 1
D/RxJava: map i = 2
D/RxJava: next i = 2
D/RxJava: map i = 3
D/RxJava: next i = 3
D/RxJava: map i = 4
D/RxJava: next i = 4
D/RxJava: map i = 5
D/RxJava: next i = 5

我希望以后能够在onNext回调中使用Toasts并刷新onCompleted中的适配器,所以我不能删除observeOn(AndroidSchedulers.mainThread()

我相信这个问题可以通过主题来解决,任何人都有一个简单的例子说明如何使用主题来解决我的问题?

1 个答案:

答案 0 :(得分:1)

  

我期待的是更像这样的东西

我会假设通过这句话你的意思是输出中的顺序。每当订阅在与发布者相同的线程中运行时,您将获得该订单,但由于发布者和订阅者都在不同的线程中运行,因此它们不再在输出方面同步,即发布者可能超过订阅者或反向并且将不再保证打印顺序。您保证的是您的订阅以序列化方式接收事件。

即使在第一个输出块中,你会看到映射在任何下游事件推送之前发生,但这只是由arrayIntegers上的数据量引起的错觉,尝试在列表中添加更多元素你会看到输出模式是如何破坏的。