KeijuMatsumoto authored on 12 Nov 2017
.idea [add] Project 7 years ago
app [add] flatmap 7 years ago
gradle/ wrapper [add] Project 7 years ago
.gitignore [add] Project 7 years ago
README.md [update] README.md 7 years ago
build.gradle [add] RxJava, RxAndroid 7 years ago
gradle.properties [add] Project 7 years ago
gradlew [add] Project 7 years ago
gradlew.bat [add] Project 7 years ago
settings.gradle [add] Project 7 years ago
README.md

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つずつ順番に行い同時に行ってはいけない