🐈

RxJava2とAutoDispose2を併用する

2021/08/28に公開

Android のアプリ開発をされているみなさん、RxJava3 への移行はお済みでしょうか?
実はまだ RxJava2 が現役バリバリで使われてますよ!っていうプロジェクトも多いのではないかと思います。今回はそんな方に向けた記事になります。

概要

AGP 7.0とuber/AutoDisposeの 2.x 系を組み合わせて使いたいが、まだ RxJava3 に移行できていない場合の暫定的な対処法をご紹介します。

背景

uber/AutoDispose という RxJava の Stream を自動的に dispose できるようにしてくれる便利なライブラリが存在します。こちらのライブラリを使うと Android の UI のライフサイクルに合わせて自動的に Stream を dispose したり、任意の Stream をトリガーにして dispose したりといったことが実現できるようになって大変便利ではあるのですが、先日リリースされた Android Studio Arctic Fox の AGP 7.0 以降と組み合わせると Android Lint がエラーになるという問題 があります。
この問題は最近解決され、解決されたバージョンとして 2.1.0 というバージョンがリリースされました。このバージョンでは RxJava2 はすでにサポートされておらず、RxJava2 がサポートされている バージョン 1.x 系は今後のリリースは見込めないという状況です。

こうした状況のため、今後もどんどん更新される AGP のアップデートに追従し続けるためには AutoDipose 2.x 系への移行が必須ということになり、これはつまり RxJava3 への移行が必要になるということを意味しています。
ところが、RxJava のようなアプリの各階層を横断して利用されるライブラリの場合、メジャーバージョンアップにはかなりのコストがかかったりリスクが大きかったりする場合があり、RxJava3 への移行は中々進んでいないプロジェクトも多くあるかと思います。

詳細

結論

RxJava2 の Stream の各型に対して AutoDispose2 の ScopeProvider などを受け付けるような、独自の拡張関数を定義することで AutoDipose 1.x 系とほとんど同じコードでビルドができるようにできます。

使用するライブラリ

実装

説明

RxJavaBridge を使って RxJava2 の各種 Stream を内部的に RxJava3 の Stream に変換した上で AutoDispose2.autoDispose 拡張関数を適用するということをしています。

Discussion