今日、Android Studio 3.1 にアップグレードしましたが、いくつかの lint チェックが追加されたようです。これらの lint チェックの 1 つは、subscribe()
変数に格納されていないワンショットの RxJava2 呼び出しに対するものです。たとえば、Room データベースからすべてのプレイヤーのリストを取得する場合:
Single.just(db)
.subscribeOn(Schedulers.io())
.subscribe(db -> db.playerDao().getAll());
大きな黄色のブロックと次のツールヒントが表示されます。
の結果は
subscribe
使用されません
このようなワンショット Rx 呼び出しのベスト プラクティスは何ですか?完了時に を保持しておく必要がありますか? それとも、 して先に進むだけでよいですDisposable
か?dispose()
@SuppressLint
これは RxJava2 ( ) にのみ影響するようでio.reactivex
、RxJava ( rx
) にはこの lint はありません。
ベストアンサー1
IDE は、サブスクリプションが破棄されていない場合にどのような影響が及ぶ可能性があるかを認識していないため、サブスクリプションを潜在的に安全でないものとして扱います。たとえば、サブスクリプションにSingle
ネットワーク呼び出しが含まれている場合、サブスクリプションが実行中に破棄されるとメモリ リークが発生する可能性がありますActivity
。
大量のDisposable
sを管理する便利な方法は、複合使い捨て; 包含クラスに新しいCompositeDisposable
インスタンス変数を作成し、すべての Disposable を CompositeDisposable に追加します (RxKotlin を使用すると、すべての Disposable に追加できますaddTo(compositeDisposable)
)。最後に、インスタンスが完了したら、 を呼び出しますcompositeDisposable.dispose()
。
これにより、糸くずの警告がなくなり、Disposables
適切に管理されるようになります。
この場合、コードは次のようになります。
CompositeDisposable compositeDisposable = new CompositeDisposable();
Disposable disposable = Single.just(db)
.subscribeOn(Schedulers.io())
.subscribe(db -> db.get(1)));
compositeDisposable.add(disposable); //IDE is satisfied that the Disposable is being managed.
disposable.addTo(compositeDisposable); //Alternatively, use this RxKotlin extension function.
compositeDisposable.dispose(); //Placed wherever we'd like to dispose our Disposables (i.e. in onDestroy()).