[英]Converting an Observable to a Flowable with backpressure in RxJava2
[英]Observable vs Flowable rxJava2
我一直在尋找新的rx java 2,我不太確定我理解backpressure
的想法了......
我知道我們有沒有backpressure
支持的Observable
和有它的Flowable
。
所以基於例子,假設我有interval
flowable
:
Flowable.interval(1, TimeUnit.MILLISECONDS, Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
// do smth
}
});
這將在大約128個值之后崩潰,這很明顯我消耗的速度比獲取項目慢。
但是后來我們和Observable
Observable.interval(1, TimeUnit.MILLISECONDS, Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
// do smth
}
});
這根本不會崩潰,即使我延遲消耗它仍然有效。 為了使Flowable
的工作可以說我把onBackpressureDrop
運營商,死機消失了,但並不是所有的值要么發出。
所以我目前無法找到答案的基本問題是,當我可以使用普通Observable
時,為什么我應該關心backpressure
仍然可以在不管理buffer
情況下接收所有值? 或者從另一方面來看, backpressure
什么優勢可以幫助我管理和處理消費?
在實踐中表現出的背壓是有界緩沖區, Flowable.observeOn
有一個128個元素的緩沖區,它們可以像下游一樣快速地消耗掉它。 您可以單獨增加此緩沖區大小以處理突發源,並且所有背壓管理實踐仍適用於1.x. Observable.observeOn
有一個無限制的緩沖區,不斷收集元素,你的應用程序可能會耗盡內存。
您可以使用Observable
例如:
您可以使用Flowable
例如:
Backpressure是指您的observable(發布者)創建的事件多於訂閱者可以處理的事件。 因此,您可以讓訂閱者丟失事件,或者您可以獲得一個巨大的事件隊列,這些事件最終會導致內存不足。 Flowable
考慮背壓。 Observable
不到。 而已。
它讓我想起了一個漏斗,當它有太多的液體溢出時。 Flowable可以幫助我們避免這種情況發生:
具有巨大的背壓:
但是使用可流動的,背壓要小得多:
Rxjava2有一些背壓策略,你可以根據你的用例使用。 通過策略我的意思是Rxjava2提供了一種方法來處理由於溢出(背壓)而無法處理的對象。
這是策略。 我不會詳細介紹它們,但是例如,如果您不想擔心溢出的項目,可以使用這樣的放置策略:
observable.toFlowable(BackpressureStrategy.DROP)
據我所知,隊列上應該有128個項目限制,之后可能會出現溢出(背壓)。 即使它不是128接近那個數字。 希望這有助於某人。
如果你需要從128更改緩沖區大小,它看起來像這樣可以完成(但看看任何內存約束:
myObservable.toFlowable(BackpressureStrategy.MISSING).buffer(256); //but using MISSING might be slower.
在軟件開發中,通常背壓策略意味着你告訴發射器減慢一點,因為消費者無法處理你的發射事件的速度。
事實上你的Flowable
在沒有背壓處理后發出128個值后崩潰並不意味着它在經過128個值之后總會崩潰:有時它會在10之后崩潰,有時它根本不會崩潰。 我相信當你用Observable
嘗試這個例子時會發生這種情況 - 碰巧沒有背壓,所以你的代碼工作正常,下次可能沒有。 RxJava 2的不同之處在於Observable
s中沒有背壓概念,也無法處理它。 如果您正在設計可能需要明確背壓處理的反應性序列 - 那么Flowable
是您的最佳選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.