DevelopRx ========= #### RxJavaの基本的な構成 * RxJavaの基本的な構成は生産者(Flowable/Observable)が消費者(Subscriber/Observer)に購読(subscribe)される形で成り立っている * Flowable/Observable * データを生産し通知するクラス * FlowableとObservableの違いは、Flowableにはバックプレッシャーの機能があり、Observableには無い * Subscriber/Observer * 通知されたデータを受け取りそのデータを使った処理を行うインターフェース * Subscriberにはバックプレッシャーの機能があり通知するデータ数をリクエストしないといけないのに対し、Observerはバックプレッシャーの機能が無いため、データ数の制限無しにデータが通知されることがある * Subscription * Reactive Streamsで定義されているインターフェースで通知するデータの数をリクエストするrequestメソッドと処理の途中でも購読を解除するcancelメソッドを持っています * Disposable * 購読を解除するためのメソッドを持つインターフェース * ObservableとObserver間の購読の際にonSubscribeメソッド経由で購読を処理の途中でも解除することができます * RxJavaの拡張モジュール * RxAndroid:Androidで使うスレッドを管理するSchedulerを持つ * RxLifecycle:AndroidのActivityやFragmentをRxJavaのFlowableやObservableのライフサイクルと同期する #### オペレータ内で生成される非同期のFLowable/Observable * flatMap() * データを受け取ると、新たにFlowable/Observableを生成して実行し、そこで通知されたデータを結果として通知するオペレータ * 受け取るデータが連続してくるような場合、生成したFlowable/Observableが同時に実行され、それぞれがデータを通知したタイミングで結果としてデータを通知するので、最終的に通知されるデータは受け取った順に実行されるとは限らない * concatMap() * flatMapと違う点は、受け取るデータが連続してくるような場合、最終的に通知されるデータは順序通り * 1つのデータの処理に時間がかかる場合は、処理が終わるまで次のFLowable/Observableを生成しない * concatMapEager() * flatMapと違う点は、受け取るデータが連続してくるような場合、最終的に通知されるデータは順序通り * 1つのデータの処理に時間がかかる場合は、全て違うスレッドで実行の後に生成されたデータがバッファされる #### リソース管理 * using() * Observable.using() * リソースの取得、リソースから取得したデータを使ったFLowable/Observableの生成、リソースの解放を行うインターフェースが用意されている #### RxJavaのバックプレッシャー * Flowableにのみ用意されており、Observableにはない * この機能が必要になるケースはFlowableとデータを受け取る側が異なるスレッド上で処理を行い、通知する処理スピードがデータを受け取る側の処理スピードより速い場合 * request() * SubscriberがonSubscribe()で受け取るSubscriptionの、Flowableがデータを何件まで通知するかをリクエストするメソッド * 1回目はonSubscribe()で通知されるデータ数のリクエストを行い、2回目以降はonNext()で処理を行った後に再度データ数のリクエストを行う * 1回目のonSubscribe()でrequest(Long.MAX_VALUE)とした場合は、通知するデータ数の制限がなくなり、生成されたデータは全て通知されるようになるため、onNext()でリクエストは不要となる * observeOn() * scheduler:Scheduler, delayError:boolean, bufferSize:intを設定することが出来る * デフォルトでbufferSizeは128となっているため、バッファされるデータが128個を超えるとMissingBackpressureExceptionが起きる * BackpressureStrategy * Flowableがどのように通知待ちのデータを扱うかのバックプレッシャーの種類 * create()でFlowableを生成する際の第2引数にBackpressureStrategyを指定する * 種類 * BUFFER:通知されるまで、全てのデータをバッファする * DROP:データを通知できるようになるまで、新たに生成されたデータを破棄する * LATEST:生成した最新のデータのみをバッファし、生成される度にバッファするデータを置き換える * 通知待ちのデータのバッファサイズを超す場合はMissingBackpressureExceptionのエラーを通知する * 特定の処理を行わない。主にonBackpressureで始まるメソッドを使ってバックプレッシャーのモードを設定する場合に使われる #### 通知する際のルール * nullを通知してはならない * データの通知は行っても行わなくても良い * Flowable/Observableの処理を終了する際は完了かエラーの通知のどちらか一方を行わないといけない。両方を通知することはない * 完了かエラーの通知を通知をした後は他の通知を行ってはいけない * 通知をする際は1つずつ順番に行い同時に行ってはいけない