blockingForEach(),为什么将函数应用于阻塞的可观察对象
blockingForEach(), why apply function to blocked observables
我无法理解阻塞 Observable 的意义,特别是 blockingForEach()
将函数应用于我们永远看不到的 Observable 有什么意义?下面,我试图让我的控制台按以下顺序输出
this is the integer multiplied by two:2
this is the integer multiplied by two:4
this is the integer multiplied by two:6
Statement comes after multiplication
我当前的方法打印乘法前的语句
fun rxTest(){
val observer1 = Observable.just(1,2,3).observeOn(AndroidSchedulers.mainThread())
val observer2 = observer1.map { response -> response * 2 }
observer2
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe{ it -> System.out.println("this is the integer multiplie by two:" + it) }
System.out.println("Statement comes after multiplication ")
}
现在我更改了我的方法以包含 blockingForEach()
fun rxTest(){
val observer1 = Observable.just(1,2,3).observeOn(AndroidSchedulers.mainThread())
val observer2 = observer1.map { response -> response * 2 }
observer2
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.blockingForEach { it -> System.out.println("this is the integer multiplie by two:" + it) }
System.out.println("Statement comes after multiplication ")
}
1.)转换后的可观察对象一旦不再阻塞会发生什么?因为我们从来没有看到那些 Observables,那不就是不必要的工作吗??
2.) 为什么我的 System.out("Statement...) 在我订阅时出现在我的 observables 之前??它就像 observable2 跳过它的阻塞方法,使 System.out 调用然后恢复订阅
不清楚您所说的您将 "never see" 观察者链发出的值的含义。观察者链中发出的每个值都会被发出点下游的观察者看到。订阅观察者链的地方通常是执行副作用的地方,例如打印值或将其存储到变量中。因此,值总是可见的。
在您的示例中,您对调度程序的工作方式感到困惑。当您使用 observeOn()
或 subscribeOn()
运算符时,您是在告诉观察者链在 之后发出值 值被移动到另一个线程。当您在线程之间移动数据时,目标线程必须能够处理数据。如果您的主要代码 运行 在同一线程上,您可以将自己锁定在外,否则您将重新排序操作。
通常情况下,强烈建议不要使用阻塞操作。测试时通常可以使用阻塞操作,因为您可以完全控制后果。在其他几种情况下,阻塞可能是有意义的。一个例子是需要访问数据库或其他资源的应用程序;如果没有该资源,应用程序将毫无意义,因此它会阻塞,直到它变得可用或发生超时,然后将其踢出。
我无法理解阻塞 Observable 的意义,特别是 blockingForEach()
将函数应用于我们永远看不到的 Observable 有什么意义?下面,我试图让我的控制台按以下顺序输出
this is the integer multiplied by two:2
this is the integer multiplied by two:4
this is the integer multiplied by two:6
Statement comes after multiplication
我当前的方法打印乘法前的语句
fun rxTest(){
val observer1 = Observable.just(1,2,3).observeOn(AndroidSchedulers.mainThread())
val observer2 = observer1.map { response -> response * 2 }
observer2
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe{ it -> System.out.println("this is the integer multiplie by two:" + it) }
System.out.println("Statement comes after multiplication ")
}
现在我更改了我的方法以包含 blockingForEach()
fun rxTest(){
val observer1 = Observable.just(1,2,3).observeOn(AndroidSchedulers.mainThread())
val observer2 = observer1.map { response -> response * 2 }
observer2
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.blockingForEach { it -> System.out.println("this is the integer multiplie by two:" + it) }
System.out.println("Statement comes after multiplication ")
}
1.)转换后的可观察对象一旦不再阻塞会发生什么?因为我们从来没有看到那些 Observables,那不就是不必要的工作吗??
2.) 为什么我的 System.out("Statement...) 在我订阅时出现在我的 observables 之前??它就像 observable2 跳过它的阻塞方法,使 System.out 调用然后恢复订阅
不清楚您所说的您将 "never see" 观察者链发出的值的含义。观察者链中发出的每个值都会被发出点下游的观察者看到。订阅观察者链的地方通常是执行副作用的地方,例如打印值或将其存储到变量中。因此,值总是可见的。
在您的示例中,您对调度程序的工作方式感到困惑。当您使用 observeOn()
或 subscribeOn()
运算符时,您是在告诉观察者链在 之后发出值 值被移动到另一个线程。当您在线程之间移动数据时,目标线程必须能够处理数据。如果您的主要代码 运行 在同一线程上,您可以将自己锁定在外,否则您将重新排序操作。
通常情况下,强烈建议不要使用阻塞操作。测试时通常可以使用阻塞操作,因为您可以完全控制后果。在其他几种情况下,阻塞可能是有意义的。一个例子是需要访问数据库或其他资源的应用程序;如果没有该资源,应用程序将毫无意义,因此它会阻塞,直到它变得可用或发生超时,然后将其踢出。