購読の結果は使用されません質問する

購読の結果は使用されません質問する

今日、Android Studio 3.1 にアップグレードしましたが、いくつかの lint チェックが追加されたようです。これらの lint チェックの 1 つは、subscribe()変数に格納されていないワンショットの RxJava2 呼び出しに対するものです。たとえば、Room データベースからすべてのプレイヤーのリストを取得する場合:

Single.just(db)
            .subscribeOn(Schedulers.io())
            .subscribe(db -> db.playerDao().getAll());

大きな黄色のブロックと次のツールヒントが表示されます。

の結果はsubscribe使用されません

Android Studio のスクリーンショット。コードはツールチップとともに黄色で強調表示されます。ツールチップのテキスト: subscribe の結果は使用されません。

このようなワンショット Rx 呼び出しのベスト プラクティスは何ですか?完了時に を保持しておく必要がありますか? それとも、 して先に進むだけでよいですDisposableか?dispose()@SuppressLint

これは RxJava2 ( ) にのみ影響するようでio.reactivex、RxJava ( rx) にはこの lint はありません。

ベストアンサー1

IDE は、サブスクリプションが破棄されていない場合にどのような影響が及ぶ可能性があるかを認識していないため、サブスクリプションを潜在的に安全でないものとして扱います。たとえば、サブスクリプションにSingleネットワーク呼び出しが含まれている場合、サブスクリプションが実行中に破棄されるとメモリ リークが発生する可能性がありますActivity

大量のDisposablesを管理する便利な方法は、複合使い捨て; 包含クラスに新しい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()).

おすすめ記事