【Programming】RxJava リアクティブプログラミング vol.5 / 「Cold」と「Hot」の生産者

in #promari5 years ago

rt6k1577jr.png

前回はRxJavaの構成についてまとめました(記事はこちら)。今回は「Cold」と「Hot」の生産者についてまとめてみます。

1.3.6 「Cold」と「Hot」の生産者

1.3.6.1 両者の違い
  • RxJavaにおいて、生産者は「Cold」な生産者と「Hot」な生産者の2種類がある。

  • 「Cold」な生産者は1つの消費者のみに対し購読関係を結ぶ。「Cold」な生産者では通知するデータのタイムラインが購読
    されるたびに生成される。

  • 「Hot」な生産者は複数の消費者に対し購読関係を結ぶ。「Hot」な生産者では既に作成した通知するデータのタイムラインに、後から消費者が加わる。

    • Coldな生産者

vbnpycy09r.png

Source:RxJava - Cold および Hot な生産者(Flowable / Observable)

  • Hotな生産者

4mt1yq7wvp.png

Source:RxJava - Cold および Hot な生産者(Flowable / Observable)

1.3.6.2 購読のタイミング
  • 「Cold」な生産者に対して購読すると生産者の処理が開始される。
  • 「Hot」な生産者に対して購読しても生産者の処理が開始されるとは限らない。
  • 「Hot」な生産者の場合、既に処理を開始している生産者に対して購読すると、途中からデータを受け取るようになる。
  • 「Hot」な生産者の場合、同じデータを複数の消費者で受け取ることも可能
  • 「Hot」な生産者の場合、途中からのデータを通知される可能性もあるため、複数の購読者が同じデータを受け取れるとは限らない
1.3.6.3 RxJava でのCold/Hotな生産者
  • 基本的に生成メソッドによって生成された生産者は「Cold」な生産者となる。
  • Hotな生産者をつくるにはColdな生産者を作ってからHotな生産者へと変換するメソッドを呼んで変換するか、 Processor や Subjectをつくる
  • HotなFlowable/ObservableとしてConnectableFlowable/ConnectableObservableがある。
1.3.6.4 ConnectableFlowable/ConnectableObservable
  • ConnectableFlowable/ConnectableObservableは「Hot」なFlowable/Observableであり、複数のSubscriber/Observerから同時に購読することができる
  • 「Cold」の場合と異なりsubscribeメソッドを呼ばれても処理を開始せず、connectメソッドを呼び出すことで処理を開始する。
  • 上記により、処理の開始前に複数のSubscriber/Observerに購読させ、その後で処理を開始して、複数の購読者に最初から同時にデータを通知することが可能となる。逆に言うとconnectメソッドが呼ばれるまで処理が開始しないことになる。
1.3.6.5 refCountメソッド
  • refCountメソッドはConnectableFlowable/ConnectableObservableから新たなFlowable/Observableを生成する。
  • このFlowable/Observableは他の消費者に購読されている限り途中から購読されても同じタイムライン上で生成されるデータを通知する。
  • refCountメソッドで生成されたFlowable/Observableは既にConnectableFlowable/ConnectableObservableではないのでconnectメソッドが無くなり、まだ購読されていない状態ならsubscribeメソッドが呼ばれると処理を開始する。
  • refCountメソッドで生成されたFlowable/Observableは処理が完了した後や全ての購読が解除された後に再度subscribeメソッドがばれると、再び新たな処理を開始する。

she1xtmg8e.png

Source:reactivex/io

1.3.6.6 autoConnectメソッド
  • autoConnectメソッドはConnectableFlowable/ConnectableObservableから指定した数の購読がされたタイミングで処理を始めるFlowable/Observableを生成する。
  • 引数なしのautoConnectメソッドから生成した場合は最初にsubscribeメソッドが呼ばれたタイミングで処理を開始し、引数に購読数を指定した場合はその購読数に達した時点で処理を開始する。
  • autoConnectメソッドで生成されたFlowable/Observableは処理が完了した後や全ての購読が解除された後に再度subscribeメソッドを呼んでも、再度処理が始まることはない。

d9woiucgkt.png

Source:reactivex/io

1.3.7 Flowable/Observableを「Cold」から「Hot」に変換するオペレータ

1.3.7.1 publish
  • publishメソッドは元の「Cold」なFlowable/ObservableからConnectableFlowable/ConnectableObservableを生成するオペレータ
  • このメソッドで生成さ
    れたConnectableFlowable/ConnectableObservableは処理を開始した後に購読された場合、それ以降に生成されたデータから新たな消費者に対して通知を始める。

e3y41xyeb4.png

Source:reactivex/io

1.3.7.2 replay
  • replayメソッドは元の「Cold」なFlowable/ObservableからConnectableFlowable/ConnectableObservableを生成するオペレータ
  • このメソッドで生成されたConnectableFlowable/ConnectableObservableは通知したデータをキャッシュしており、処理を開始した後に購読された場合、最初にそのキャッシュしたデータを新たに購読した消費者に通知する。その後は全ての消費者に対し同じデータを通知する。
  • 引数がない場合は全てのデータをキャッシュし、引数がある場合は指定した個数や期間のデータをキャッシュする。

dhwuj6bhmh.png

Source:reactivex/io

  • バッファサイズで指定

ojiyhne6ff.png

Source:reactivex/io

  • 時刻で指定

wjk611h3gr.png

Source:reactivex/io

1.3.7.3 share

  • shareメソッドは複数の消費者から購読されることができるFlowable/Observableを生成する。
  • 他のメソッドと違い、ConnectableFlowable/ConnectableObservableを生成しない
  • shareメソッドから生成されたFlowable/Observableは購読している消費者がいる間は途中で新たに購読されても、同じタイムライン上で生成されるデータを通知する。
  • 実質的にはflowable.publish().refCount()と同じになる。

1vstu2532p.png

Source:reactivex/io

t0r78hqbeu.png
written by tamito0201

プログラミングとのご縁結びならプロマリへ。

オンラインプログラミング学習スクールのプロマリは、プログラミングの初学者の皆様を応援しています。プログラミング講師と一緒に面白いアプリを作りませんか。

btpb5hmlur.png

The programming school "Promari" will help you learn programming. "Promari" is supporting the first scholars of programming. Let's develop an application with our programming instructor.

Sort:  

Thanks for using eSteem!
Your post has been voted as a part of eSteem encouragement program. Keep up the good work! Install Android, iOS Mobile app or Windows, Mac, Linux Surfer app, if you haven't already!
Learn more: https://esteem.app
Join our discord: https://discord.gg/8eHupPq

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.034
BTC 63877.55
ETH 3143.56
USDT 1.00
SBD 3.97