首页 > 解决方案 > rxjava 输出的排列不是唯一的

问题描述

为什么这些代码的输出不同:

Observable.fromArray("Red", "Orange", "Blue")
            .doOnNext(color ->{
                Log.i(TAG, "Color "+  color + " pushed through on $ " +Thread.currentThread());})
            .map(String::length)
            .subscribe(length ->
                    Log.i(TAG, "Length $" + length + " being recieved on $" + Thread.currentThread()));

输出:

Color Red pushed through on $ Thread[main,5,main]
Length $3 being recieved on $Thread[main,5,main]
Color Orange pushed through on $ Thread[main,5,main]
Length $6 being recieved on $Thread[main,5,main]
Color Blue pushed through on $ Thread[main,5,main]
Length $4 being recieved on $Thread[main,5,main]

Observable.fromArray("Red", "Orange", "Blue")
                .doOnNext(color ->{
                    Log.i(TAG, "Color "+  color + " pushed through on $ " +Thread.currentThread());})
                .map(String::length)
                .observeOn(Schedulers.computation())
                .subscribe(length ->
                        Log.i(TAG, "Length $" + length + " being recieved on $" + Thread.currentThread()));

输出:

Color Red pushed through on $ Thread[main,5,main]
Color Orange pushed through on $ Thread[main,5,main]
Color Blue pushed through on $ Thread[main,5,main]
Length $3 being recieved on $Thread[main,5,main]
Length $6 being recieved on $Thread[main,5,main]
Length $4 being recieved on $Thread[main,5,main]

为什么输出排列不同?我在observeon方法中使用的每个调度程序,但在触发doonnext和订阅时输出不同?

标签: androidrx-java2

解决方案


doOnNext 正在当前线程上完成,订阅正在 Schedulers.computation 线程上完成。因此,由于多线程竞争条件,它们完成的顺序可能是随机的。subscribeOn 仅适用于其直接调用的对象。


推荐阅读