Beobachtbar gegen fließfähiges rxJava2
Ich war auf der Suche nach neuen rx java 2 und ich bin mir nicht ganz sicher, ich verstehe die Idee von backpressure
mehr...
Ich bin mir bewusst, dass wir Observable
dass nicht backpressure
Unterstützung und Flowable
, die es hat.
Also basierend auf Beispiel, können sagen, ich habe flowable
mit interval
:
Flowable.interval(1, TimeUnit.MILLISECONDS, Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
//do smth
}
});
Das wird Absturz-nach rund 128 Werte, und das ist ziemlich offensichtlich, ich bin Konsum langsamer als der erste Artikel.
Aber dann haben wir das gleiche mit 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
}
});
Diese wird nicht Abstürzen, auch wenn ich mit einiger Verzögerung auf den Konsum es funktioniert immer noch. Um Flowable
Arbeit können sagen, lege ich onBackpressureDrop
Betreiber, crash ist Weg, aber nicht alle Werte emittiert werden.
Also die Basis-Frage kann ich nicht beantworten, die derzeit in meinem Kopf ist, warum sollte es mich kümmern, über backpressure
wenn ich kann verwenden nur Observable
weiterhin alle Werte ohne die Verwaltung der buffer
? Oder vielleicht von der anderen Seite, welche Vorteile backpressure
mir zu Gunsten von die Verwaltung von und den Umgang mit dem Konsum?
InformationsquelleAutor der Frage user2141889 | 2016-10-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gegendruck, was sich manifestiert, ist in der Praxis begrenzt Puffer
Flowable.observeOn
einen Puffer von 128 Elementen, wird entwässert so schnell wie der dowstream kann es dauern. Erhöhen Sie diese Puffer-Größe individuell zu behandeln Burst-Quelle und alle die Gegendruck-management-Praktiken noch gelten ab dem 1.x.Observable.observeOn
hat einen unbegrenzten Puffer, der hält das sammeln der Elemente, und Ihre Anwendung möglicherweise ausführen zuwenig Arbeitsspeicher.Können Sie verwenden
Observable
zum Beispiel:Können Sie verwenden
Flowable
zum Beispiel:InformationsquelleAutor der Antwort akarnokd
Gegendruck ist, wenn Ihre beobachtbaren (Verleger) ist die Schaffung von mehr Ereignisse als die Ihre Abonnenten behandeln können. So können Sie die Abonnenten fehlen Ereignisse, oder können Sie sich eine riesige Warteschlange von Ereignissen, die nur führt zu out of memory schließlich.
Flowable
nimmt Gegendruck zu berücksichtigen.Observable
nicht. Thats it.es erinnert mich an einen Trichter, wenn es zu viel Flüssigkeit überläuft. Fließfähige helfen kann mit nicht passieren:
mit enormen Gegendruck:
aber mit einem fließfähigen, es gibt viel weniger Gegendruck :
Rxjava2 hat ein paar Gegendruck-Strategien, die Sie verwenden können, je nach Anwendungsfall. mit Strategie meine ich Rxjava2 liefert eine Methode zum behandeln der Objekte, die nicht verarbeitet werden kann, weil der überlauf (Gegendruck).
hier sind die Strategien.
Ich werde nicht gehen durch Sie alle, aber zum Beispiel, wenn Sie wollen, sich keine Gedanken über die Elemente, die sind übergelaufen, können Sie ein drop-Strategie so:
beobachten.toFlowable(BackpressureStrategy.DROP)
Soweit ich weiß sollte es eine 128-Element-Grenze in der Warteschlange, danach kann es ein überlauf (Gegendruck). Auch wenn Ihr nicht 128 sein in der Nähe dieser Zahl. Hoffe, das jemand hilft.
wenn Sie müssen, ändern Sie die Puffergröße von 128 sieht es aus wie es getan werden kann
wie diese (aber Vorsicht Speicher-Einschränkungen:
InformationsquelleAutor der Antwort j2emanue
Die Tatsache, dass Ihre
Flowable
stürzte, nachdem emitting 128 Werte ohne Gegendruck Umgang bedeutet nicht, es wird immer crash nach exakt 128 Werte: stürzt manchmal nach 10, manchmal wird es nicht Abstürzen an alle. Ich glaube, das ist, was passiert, wenn Sie versucht, das Beispiel mitObservable
- es war kein Gegendruck, sodass Ihr code arbeitete normal, das nächste mal ist es vielleicht nicht. Der Unterschied in RxJava 2 ist, dass es kein Konzept der Gegendruck inObservable
s mehr, und keine Möglichkeit, es zu handhaben. Wenn Sie die Gestaltung einer reaktiven Sequenz, die wahrscheinlich erfordern explizite Gegendruck handling - dannFlowable
ist Ihre beste Wahl.InformationsquelleAutor der Antwort Egor