android - 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和订阅时输出不同?
解决方案
doOnNext 正在当前线程上完成,订阅正在 Schedulers.computation 线程上完成。因此,由于多线程竞争条件,它们完成的顺序可能是随机的。subscribeOn 仅适用于其直接调用的对象。
推荐阅读
- ios - Xcode 错误有关 plist 的额外信息:ACL=
- javascript - 为什么只读输入不会在 iPad 上的 Tab 键按下时触发焦点事件?
- c# - C# 8 不可为空的引用和隐式使用
- c - 同步两个线程
- sql - 插入日期,Oracle 12,Flyway
- c# - 根据放置在其内部列表属性上的条件对列表进行排序
- python - Python OpenCV 填充红色勾勒的圆圈
- node.js - 如何解决:在 Node.js 服务器的 onclosenexttick 处过早关闭?
- reactjs - 如何为 react-bootstrap 的活动选项卡切换 css 类?
- sql - 从其他列计算百分比值