1. ホーム
  2. android

[解決済み] サブスクライブの結果は使用されません

2022-05-03 10:52:43

質問

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

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

結果、大きな黄色のブロックとこのツールチップが表示されます。

<ブロッククオート

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

このようなワンショットのRxコールのベストプラクティスは何ですか?を保持し続けるべきでしょうか? Disposabledispose() を完全な形で表示しますか?それとも @SuppressLint を作成して、次に進みますか?

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

解決方法は?

IDE は、サブスクリプションが破棄されていないときにどのような潜在的効果があるかを知らないので、潜在的に安全でないものとして扱います。たとえば、あなたの Single にネットワークコールが含まれている場合、メモリリークを引き起こす可能性があります。 Activity が実行中に放棄された場合。

を大量に管理するのに便利な Disposable を使用することです。 CompositeDisposable を作成するだけです。 CompositeDisposable インスタンス変数を作成し、CompositeDisposable に Disposable を追加します。 addTo(compositeDisposable) をすべてのDisposableに追加してください)。最後に、インスタンスの作成が完了した時点で compositeDisposable.dispose() .

これにより、lint の警告がなくなり、また 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()).