【问题标题】:RxJava order of execution confusion, subject neededRxJava 执行顺序混乱,需要主题
【发布时间】:2017-11-01 16:54:13
【问题描述】:

我有一个非常简单的 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()

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

【问题讨论】:

标签: rx-java rx-java2


【解决方案1】:

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

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

即使在第一个输出块中,您也会看到映射发生在任何下游事件推送之前,但这只是您在arrayIntegers 上拥有的数据量造成的错觉,尝试向列表中添加更多元素,然后您'将看看输出的模式是如何打破的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多