我今天已经升级到Android Studio 3.1,似乎已经添加了一些检查功能。这些棉绒检查之一是针对未存储在变量中的一次性RxJava2 subscribe()调用。例如,从我的房间数据库中获取所有玩家的列表:

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

结果会出现一个大的黄色方块,并且此工具提示:



android - 未使用订阅结果-LMLPHP

像这样的一键式Rx调用的最佳实践是什么?我应该完整保留Disposabledispose()吗?还是我应该@SuppressLint并继续前进?

这似乎只影响RxJava2(io.reactivex),RxJava(rx)没有此功能。

最佳答案

IDE不知道您的订阅在不被处置时可能产生什么潜在影响,因此将其视为潜在的不安全因素。例如,您的Single可能包含一个网络调用,如果在执行过程中放弃了Activity,则可能导致内存泄漏。

一种管理大量Disposable的便捷方法是使用CompositeDisposable。只需在您的封闭类中创建一个新的CompositeDisposable实例变量,然后将您的所有Disposables添加到CompositeDisposable(使用RxKotlin,您可以将addTo(compositeDisposable)附加到所有Disposables)。最后,完成实例后,调用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()).

10-04 23:02