簡體   English   中英

RxJava執行順序混亂

[英]RxJava order of execution confusion

我有這個非常簡單的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

有人可以解釋我做錯了什么導致我的訂單不正確嗎?

您的Rx管道在兩個不同的線程中運行。 第一個線程( Schedulers.newThread() )執行fromIterablemap 第二個調用DisposableObserver

在兩個線程之間, observeOn()運算符內部有一個(不可見的)緩沖區。 因此,發生的情況是,第一個線程獲得了一些cpu時間,快速完成了所有工作,並將結果放入observeOn緩沖區中。 這可能是在CPU上該線程的一次旋轉期間發生的。

然后,啟動第二個線程,它從緩沖區中獲取項目並通過調用DisposableObserver繼續進行處理。

我認為您在這里尋找的是使用單個線程。 刪除observeOn運算符,看它是否完成了您想要的操作。

編輯:剛剛嘗試刪除observeOn運算符並在我的機器上運行它。 結果如下:

RxJava map i = 1
RxJava next i = 1
RxJava map i = 2
RxJava next i = 2
RxJava map i = 3
RxJava next i = 3
RxJava map i = 4
RxJava next i = 4
RxJava map i = 5
RxJava next i = 5

為了將來參考,打印到達各種Rx運算符的線程名稱可能對調試有用。 您可以使用Thread.currentThread().getName()獲得名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM