flu*_*y03 1 asynchronous reactive-programming java-8 rx-java reactivex
ReactiveX不偏向某些特定的并发或异步性源.可以使用线程池,事件循环,非阻塞I/O,演员(例如来自Akka)或任何适合您的需求,风格或专业知识的实现来实现Observable. 客户端代码将其与Observable的所有交互视为异步,无论您的底层实现是阻塞还是非阻塞,然而您选择实现它.
我没有得到这个部分 - " 你的底层实现是阻塞还是非阻塞 ".
你能解释一下吗?或者一些示例代码来解释这个?
Observable.fromCallable(() -> doSomeReallyLongNetworkRequest())
.subscribe(data -> {
showTheDataOnTheUI(data);
});
Run Code Online (Sandbox Code Playgroud)
你认为doSomeReallyLongNetworkRequest()它将在哪里运行(线程)?
好吧,如果您将在主线程运行此代码,网络调用将在主线程运行!
"Observables意见较少"意味着多线程被抽象出实际工作.订阅者不知道(并且不需要),Observable将运行的地方,它可以在线程池,事件循环上运行,或者它甚至可以以阻塞方式运行.
这就是为什么所有Observable交互都发生在异步API上的原因.
虽然这样做似乎是一个缺点,但事实恰恰相反,这意味着您可以更好地控制代码的每个部分的运行,而不会暴露操作本身以及Observable对此知识的排放做出反应的代码.
这是使用SchedulersRxJava中的机制和subscribeOn()/ observeOn()运算符一起完成的:
Observable.fromCallable(() -> doSomeReallyLongNetworkRequest())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(data -> {
showTheDataOnTheUI(data);
});
Run Code Online (Sandbox Code Playgroud)
现在你告诉Observable要执行订阅代码(doSomeReallyLongNetworkRequest())在IO Schdeuler上运行,它将为网络请求创建一个专用线程,另一方面,你告诉它在主线程Observable上通知有关emit (onNext())Subscriber(showTheDataOnTheUI(data))的信息(对不起)对于Android特定的).
使用这种方法,您可以使用非常强大的机制来确定两个操作在何处以及如何工作以及将在何处触发通知,并且非常容易在不同线程之间进行乒乓,这种强大的功能来自于异步API,以及线程的抽象.专用运营商和调度机制.
更新:进一步说明:
客户端代码将其与Observable的所有交互视为异步
这里的客户端代码意味着与之交互的任何代码,Observable简单示例是Subscriber客户端Observable,从可组合性质的角度来看Observable,您可以Observable从某些API 获取,而无需确切了解其操作如何:
Observable.fromCallable(() -> doSomeReallyLongNetworkRequest())
Run Code Online (Sandbox Code Playgroud)
可以使用某些服务API封装Observable<Data>,当Subscriber与它交互时,使用ObservableonNext,onError,onComplete上的事件以异步方式进行.
您的底层实现是阻塞还是非阻塞,但是您选择实现它.
"底层实现"指的是Observable的操作,它可以像我的网络调用示例那样阻塞工作,但它也可以是来自UI的通知(点击事件),或者更新发生在某些外部模块上,所有这些都是是非阻塞实现,并且再次作为其异步API性质Subscribe应该不关心,它只需要对通知作出反应而不必担心实现(Observable body)将在何处以及如何行动.
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |