RxJavaは、ObservableとObserverを介してObserverパターンを実装する、JavaおよびAndroid向けのリアクティブプログラミングライブラリです。ReactiveX GitHub、2026によると、RxJavaは演算子チェーンを使用して非同期データストリームとイベントを処理できます。基本単位はObservableで、変換チェーンを介してObserverにデータを発行します。RxJava 3は現在の安定バージョンであり、Java 8ラムダ、Reactive Streams、RxAndroidを介したAndroid統合をサポートしています。
重要ポイント
RxJavaはReactiveX仕様のJava実装であり、観測可能なストリーム(Observable)を使用した非同期プログラミングのためのライブラリです。RxJava 2は2016年にReactive Streams(Flowable)のサポートと、rx.Observableおよびio.reactivex.Observableへの分割とともにリリースされました。RxJava 3(2019)は、RxJava 2との下位互換性を持つ現在のメジャーバージョンです。
RxJavaの中核となる考え方は、すべてがストリームであるということです:データストリーム、イベントストリーム、状態ストリーム。任意の非同期操作は、データ、エラー、または完了シグナルを発行するObservableとして表現できます。ObserverがObservableにサブスクライブし、リアルタイムで通知を受け取ります。
Badoo(2024)によると、コルーチンへの移行前は、Google Playトップ200のAndroidアプリの76%が非同期操作にRxJavaを使用していました。現在はコルーチンにシェアを奪われていますが、RxJavaは何千ものアプリのプロダクションコードに残り、成熟した実績のある技術と見なされています。ReactiveXはクロスプラットフォーム仕様であり、JavaScript(RxJS)、.NET(Rx.NET)、Swift(RxSwift)などにも実装されています。
ReactiveXは、古典的なObserverパターンを2つのメカニズムで拡張します:演算子チェーンとSchedulerベースのスレッド管理です。ObservableはObserverがサブスクライブするまでデータの発行を開始しません(遅延評価)。これにより、サブスクリプションが存在する場合にのみアクティブになるデータパイプラインを構築できます。
Observable — onErrorまたはonCompleteで0..N個の要素を発行する基本型。無制限のデータストリームに適しています。例えば、クリックイベントや位置情報の更新などです。Observableはバックプレッシャーをサポートしません。
Flowable — バックプレッシャーをサポートするObservableのReactive Streams版。データソースがObserverの処理速度よりも速く要素を生成する可能性がある場合に使用します。FlowableはBACKPRESSURE_BUFFER、DROP、LATEST、ERRORの各戦略をサポートしています。
| 型 | 要素数 | バックプレッシャー | 用途 |
|---|---|---|---|
| Observable | 0..N | なし | UIイベント、小規模ストリーム |
| Flowable | 0..N | あり | 大規模データ、リアルタイム |
| Single | 1 (onSuccess/onError) | — | 単一応答(ネットワーク) |
| Maybe | 0..1 | — | オプション値(キャッシュ) |
| Completable | 0 (onComplete/onError) | データなし操作(書き込み) |
Singleは正確に1つの要素またはエラーを発行します — ネットワークリクエストに最適です。Maybeは0または1個の要素を発行し、データが存在しない可能性のあるキャッシュに適しています。CompletableはデータなしでonCompleteまたはonErrorのみを発行し、書き込みや削除操作に便利です。これらの型は、契約を特定のケースに限定することでAPIを簡素化します。Retrofit(Android向けの一般的なHTTPクライアント)は5つのRxJava型すべてを直接サポートしており、余分なボイラープレートコードなしで各エンドポイントに最適な戻り値の型を選択できます。
演算子は、あるObservableを別のObservableに変換する関数です。演算子チェーンはデータパイプラインを記述します。各演算子は前の演算子からストリームを受け取り、変換して次の演算子に渡します。RxJavaにはカテゴリに分類された200以上の演算子が含まれています。
flatMapは最も強力なRxJava演算子の1つです。各要素に対して非同期リクエストを実行し、結果を共通のストリームに収集できます。例えば、flatMapはIDのリストから詳細をロードするために使用されます:各ID → ネットワークリクエスト → 結果のマージ。mapが単に要素を変換するのとは異なり、flatMapは複数の要素を発行したり、別のObservableに切り替えたりできるため、非同期パイプライン構築の基盤となります。
onErrorResumeNext — エラー時にバックアップのObservableに切り替えます。retry — エラー時にN回再サブスクライブします。onErrorReturn — エラーの代わりにデフォルト値を返します。doOnError — ストリームを変更せずにエラー時に副作用を実行します(ロギングや分析)。これらの演算子を組み合わせることで、手動のtry/catchなしで明確なエラー処理戦略を持つ堅牢なパイプラインを構築できます。
Schedulersは、ObservableとObserverが実行されるスレッドを決定します。subscribeOnはソースのスレッドを設定し、observeOnはObserverと後続の演算子のスレッドを設定します。この分離はRxJavaの重要な利点です:ソースはIOスレッド、処理はcomputation、UIはメインスレッドで実行されます。
主なSchedulers:Schedulers.io() — I/O操作用(ネットワーク、ディスク)、無制限プール。Schedulers.computation() — 計算用、コア数に応じた固定プール。Schedulers.newThread() — タスクごとに新しいスレッド。AndroidSchedulers.mainThread() — Androidメインスレッド(RxAndroid)。Schedulers.trampoline()もあり、FIFOキューで現在のスレッドでタスクを実行するため、テストに便利です。
Google(2025)によると、Schedulersの適切な使用は初心者にとってRxJavaで最も難しい部分です。典型的な間違いは、observeOnの後にsubscribeOnを呼び出すことで、ソースに影響を与えません。subscribeOnはソースのチェーンで最初に、observeOnはUIサブスクリプションの前に配置する必要があります。ルール:subscribeOnは上流(ソース)のみに影響し、observeOnは下流(サブスクライバとその後のすべての演算子)を切り替えます。
3つのシナリオを考えてみましょう:Singleを使用したネットワークリクエスト、zipを使用した並行リクエスト、debounceを使用した検索フィールドのデバウンスです。
SingleはRetrofitリクエストに最適です:1リクエスト — 1応答。UI更新のためにメインスレッドでサブスクライブします。
api.getUser(id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<User>() {
@Override
public void onSuccess(User user) { showUser(user); }
@Override
public void onError(Throwable e) { showError(e); }
})
zipは2つの独立したSingleの結果を1つに結合します。これらは並行して実行され、両方が完了した後に結果が生成されます。
Single.zip(
api.getProfile(),
api.getSettings(),
(profile, settings) -> new Dashboard(profile, settings)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(dashboard -> showDashboard(dashboard), e -> logError(e))
debounceは急速なテキスト変更を無視し、400ミリ秒の休止後にのみリクエストを送信します。distinctUntilChangedはテキストが変更されていない場合にリクエストをキャンセルします。
RxTextView.textChanges(searchView)
.debounce(400, TimeUnit.MILLISECONDS)
.filter(text -> text.length() >= 3)
.distinctUntilChanged()
.switchMap(query -> api.search(query))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(results -> showResults(results))
RxJavaとKotlin Coroutinesは同じ問題 — 非同期プログラミング — を解決しますが、根本的に異なるアプローチを取ります。RxJavaはObserverパターンに基づいて構築されており、プッシュベースです:ソースがデータを送信し、Observerが反応します。コルーチンはプルベースです:コードがawaitを介して順次データを要求します。
Google I/O 2024によると、Kotlin CoroutinesはAndroidで新しい非同期コードを書くための推奨アプローチです。RxJavaは既存プロジェクト向けにサポートされています。Googleは段階的な移行のためのブリッジライブラリ(kotlinx-coroutines-rx3)を提供しています。AndroidX(LiveData、Room、Paging 3)は両方のアプローチをサポートしており、依存関係の競合なしに古いモジュールでRxJava、新しいモジュールでコルーチンを使用できます。
段階的な移行:新しいコンポーネントはコルーチンで書き、古いRxJavaコードはそのまま残します。RxJava → コルーチンはawaitSingle()またはawaitFirst()を介して。コルーチン → RxJavaはfuture()またはasFlowable()を介して。大規模プロジェクトの場合、完全な移行には6〜18か月かかります。
よくある質問
Observableはバックプレッシャーをサポートしていません — ソースがハンドラの処理速度よりも速くデータを生成すると、MissingBackpressureExceptionが発生します。Flowableは構成可能なバッファリング戦略でReactive Streamsバックプレッシャーをサポートします。
subscribeOnはソースObservableを実行するSchedulerを設定します。observeOnはチェーン内のObserverおよび後続のすべての演算子のSchedulerを設定します。subscribeOnは上流に影響し、observeOnは下流に影響します。
新しいプロジェクトの場合は — はい、Googleはコルーチンを推奨しています。既存のプロジェクトの場合は — kotlinx-coroutines-rx3を介した段階的な移行。RxJavaはレガシーコードに対して安定してサポートされています。
演算子を使用します:onErrorReturn(デフォルト値)、onErrorResumeNext(バックアップObservable)、retry(N回再試行)。またはObserver.onError()を介してユーザーに表示します。
CompositeDisposableは複数のサブスクリプションを管理するためのコンテナです。dispose()が呼び出されると、追加されたすべてのサブスクリプションがキャンセルされます。Activity/Fragmentで画面が破棄されるときにすべてのリクエストをキャンセルするために使用されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。