摘要:相對于最大的更新就是把對背壓問題的處理邏輯從中抽取出來產(chǎn)生了新的可觀察對象。由于基于發(fā)射的數(shù)據(jù)流,以及對數(shù)據(jù)加工處理的各操作符都添加了背壓支持,附加了額外的邏輯,其運行效率要比慢得多。
背壓(backpressure)
當(dāng)上下游在不同的線程中,通過Observable發(fā)射,處理,響應(yīng)數(shù)據(jù)流時,如果上游發(fā)射數(shù)據(jù)的速度快于下游接收處理數(shù)據(jù)的速度,這樣對于那些沒來得及處理的數(shù)據(jù)就會造成積壓,這些數(shù)據(jù)既不會丟失,也不會被垃圾回收機制回收,而是存放在一個異步緩存池中,如果緩存池中的數(shù)據(jù)一直得不到處理,越積越多,最后就會造成內(nèi)存溢出,這便是響應(yīng)式編程中的背壓(backpressure)問題。
例如,運行以下代碼:
public void demo1() {
Observable .create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter e) throws Exception { int i = 0; while (true) { i++; e.onNext(i); } } }) .subscribeOn(Schedulers.newThread()) .observeOn(Schedulers.newThread()) .subscribe(new Consumer () { @Override public void accept(Integer integer) throws Exception { Thread.sleep(5000); System.out.println(integer); } }); }
創(chuàng)建一個可觀察對象Observable在Schedulers.newThread()的線程中不斷發(fā)送數(shù)據(jù),而觀察者Observer在Schedulers.newThread()的另一個線程中每隔5秒接收打印一條數(shù)據(jù)。
運行后,查看內(nèi)存使用如下:
由于上游通過Observable發(fā)射數(shù)據(jù)的速度大于下游通過Consumer接收處理數(shù)據(jù)的速度,而且上下游分別運行在不同的線程中,下游對數(shù)據(jù)的接收處理不會堵塞上游對數(shù)據(jù)的發(fā)射,造成上游數(shù)據(jù)積壓,內(nèi)存不斷增加,最后便會導(dǎo)致內(nèi)存溢出。
Flowable
既然在函數(shù)響應(yīng)式編程中會產(chǎn)生背壓(backpressure)問題,那么在函數(shù)響應(yīng)式編程中就應(yīng)該有解決方案。
Rxjava2相對于Rxjava1最大的更新就是把對背壓問題的處理邏輯從Observable中抽取出來產(chǎn)生了新的可觀察對象Flowable。
在Rxjava2中,F(xiàn)lowable可以看做是為了解決背壓問題,在Observable的基礎(chǔ)上優(yōu)化后的產(chǎn)物,與Observable不處在同一組觀察者模式下,Observable是ObservableSource/Observer這一組觀察者模式中ObservableSource的典型實現(xiàn),而Flowable是Publisher與Subscriber這一組觀察者模式中Publisher的典型實現(xiàn)。
所以在使用Flowable的時候,可觀察對象不再是Observable,而是Flowable;觀察者不再是Observer,而是Subscriber。Flowable與Subscriber之間依然通過subscribe()進(jìn)行關(guān)聯(lián)。
雖然在Rxjava2中,F(xiàn)lowable是在Observable的基礎(chǔ)上優(yōu)化后的產(chǎn)物,Observable能解決的問題Flowable也都能解決,但是并不代表Flowable可以完全取代Observable,在使用的過程中,并不能拋棄Observable而只用Flowable。
由于基于Flowable發(fā)射的數(shù)據(jù)流,以及對數(shù)據(jù)加工處理的各操作符都添加了背壓支持,附加了額外的邏輯,其運行效率要比Observable慢得多。
只有在需要處理背壓問題時,才需要使用Flowable。
由于只有在上下游運行在不同的線程中,且上游發(fā)射數(shù)據(jù)的速度大于下游接收處理數(shù)據(jù)的速度時,才會產(chǎn)生背壓問題;
所以,如果能夠確定:
1、上下游運行在同一個線程中,
2、上下游工作在不同的線程中,但是下游處理數(shù)據(jù)的速度不慢于上游發(fā)射數(shù)據(jù)的速度,
3、上下游工作在不同的線程中,但是數(shù)據(jù)流中只有一條數(shù)據(jù)
則不會產(chǎn)生背壓問題,就沒有必要使用Flowable,以免影響性能。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/72149.html
摘要:讓你收獲滿滿碼個蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術(shù)文章,為了讓大家在家也能好好學(xué)習(xí),特此花了幾個小時整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個蛋從2017年02月20...
摘要:只發(fā)射一條單一的數(shù)據(jù),或者一條異常通知,不能發(fā)射完成通知,其中數(shù)據(jù)與通知只能發(fā)射一個。觀察者可觀察對象對應(yīng)的觀察者為方法等同于中的。沒有用來處理完成通知的方法示例三發(fā)射完成通知示例四發(fā)射異常通知 在Rxjava2中,Observale和Flowable都是用來發(fā)射數(shù)據(jù)流的,但是,我們在實際應(yīng)用中,很多時候,需要發(fā)射的數(shù)據(jù)并不是數(shù)據(jù)流的形式,而只是一條單一的數(shù)據(jù),或者一條完成通知,或者一...
閱讀 4289·2021-11-22 13:52
閱讀 2153·2021-09-22 15:12
閱讀 1210·2019-08-30 15:53
閱讀 3524·2019-08-29 17:12
閱讀 2255·2019-08-29 16:23
閱讀 1731·2019-08-26 13:56
閱讀 1845·2019-08-26 13:44
閱讀 1952·2019-08-26 11:56