如ReactiveX Introduction - Observables Are Less Opinionated
中所述ReactiveX不偏向某些特定的并发或异步性源。可以使用线程池,事件循环,非阻塞I / O,演员(例如来自Akka)或任何适合您的需求,风格或专业知识的实现来实现Observable。 客户端代码将其与Observables的所有交互视为异步,无论您的底层实现是阻塞还是非阻塞,然而您选择实现它。
我没有得到这个部分 - “你的底层实现是阻塞还是非阻塞”。
你能解释一下吗?或者一些示例代码来解释这个?
答案 0 :(得分:5)
Observable.fromCallable(() -> doSomeReallyLongNetworkRequest())
.subscribe(data -> {
showTheDataOnTheUI(data);
});
您认为doSomeReallyLongNetworkRequest()
将在哪里运行(线程)?
好吧,如果您将在主线程运行此代码,网络调用将在主线程运行!
"可观察者的意见较少"意味着多线程从实际工作中抽象出来。订阅者不知道(并且不需要),Observable
将在其中运行,它可以在线程池,事件循环上运行,或者甚至可以以阻塞方式运行。<登记/>
这就是为什么所有Observable交互都发生在async API上的原因。
虽然这样做似乎是一个缺点,但事实恰恰相反,这意味着您可以更好地控制代码的每个部分的运行,而不会暴露操作本身以及对Observable
做出反应的代码排放到这种知识。
这是使用RxJava中的Schedulers
机制以及subscribeOn()
/ observeOn()
运算符完成的:
Observable.fromCallable(() -> doSomeReallyLongNetworkRequest())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(data -> {
showTheDataOnTheUI(data);
});
现在你告诉Observable
执行订阅代码(doSomeReallyLongNetworkRequest()
)以在IO Schdeuler上运行,它将为网络请求创建一个专用线程,另一方面,你告诉{ {1}}在主要线程上通知有关排放量(Observable
)onNext()
(Subscriber
)(对不起特定于Android的内容)。
通过这种方法,您可以使用非常强大的机制来确定两个操作在何处以及如何工作以及将在何处触发通知,并且非常容易在不同线程之间进行乒乓,这种强大的功能来自于异步API,以及线程到专用运算符和调度程序机制。
更新:进一步解释:
客户端代码将其与Observables的所有交互视为 异步
此处的客户端代码表示与showTheDataOnTheUI(data)
交互的任何代码,简单示例是Observable
,它是Subscriber
的客户端,具有{{1}的可组合性质你可以从某些API获得Observable
,而不知道它的运作方式如何:
Observable
可以使用某些服务API封装为Observable
,当订阅者与其进行交互时,使用on Observable.fromCallable(() -> doSomeReallyLongNetworkRequest())
事件onNext,onError,onComplete以异步方式进行。
您的底层实现是阻塞还是非阻塞 但是你选择实施它。
&#34;底层实施&#34;是指Observable所做的操作,它可以像我的网络调用示例那样阻塞工作,但它也可以是来自UI的通知(点击事件),或者更新发生在某些外部模块上,所有这些都是非阻塞的实现,再次作为其异步API性质Observable<Data>
不应该关心,它只需要对通知作出反应而不必担心实现(Observable body)将在何处以及如何行动。