我有这个非常简单的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()
我相信这个问题可以通过主题来解决,任何人都有一个简单的例子说明如何使用主题来解决我的问题?
答案 0 :(得分:1)
我期待的是更像这样的东西
我会假设通过这句话你的意思是输出中的顺序。每当订阅在与发布者相同的线程中运行时,您将获得该订单,但由于发布者和订阅者都在不同的线程中运行,因此它们不再在输出方面同步,即发布者可能超过订阅者或反向并且将不再保证打印顺序。您保证的是您的订阅以序列化方式接收事件。
即使在第一个输出块中,你会看到映射在任何下游事件推送之前发生,但这只是由arrayIntegers
上的数据量引起的错觉,尝试在列表中添加更多元素你会看到输出模式是如何破坏的。