我今天已经升级到Android Studio 3.1,似乎已经添加了一些检查功能。这些棉绒检查之一是针对未存储在变量中的一次性RxJava2 subscribe()
调用。例如,从我的房间数据库中获取所有玩家的列表:
Single.just(db)
.subscribeOn(Schedulers.io())
.subscribe(db -> db.playerDao().getAll());
结果会出现一个大的黄色方块,并且此工具提示:
像这样的一键式Rx调用的最佳实践是什么?我应该完整保留
Disposable
和dispose()
吗?还是我应该@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()).