Mic*_*odd 117 android lint android-studio rx-java2 android-studio-3.1
我今天已升级到Android Studio 3.1,这似乎增加了一些lint检查.其中一个lint检查是针对subscribe()未存储在变量中的一次性RxJava2 调用.例如,从我的Room数据库中获取所有玩家的列表:
Single.just(db)
.subscribeOn(Schedulers.io())
.subscribe(db -> db.playerDao().getAll());
Run Code Online (Sandbox Code Playgroud)
导致一个大的黄色块和这个工具提示:
结果
subscribe未使用
这样的一次性Rx调用的最佳做法是什么?我应该保持的保持Disposable,并dispose()在完成了吗?或者我应该@SuppressLint继续前进?
编辑这似乎只影响RxJava2(io.reactivex),RxJava(rx)没有这个lint.
urg*_*ntx 109
IDE不知道您的订阅在未处理时可能产生的影响,因此它将其视为可能不安全.例如,您Single可能包含网络调用,如果您Activity在执行期间被放弃,则可能导致内存泄漏.
管理大量Disposables的便捷方法是使用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()).
Run Code Online (Sandbox Code Playgroud)
Aks*_*125 26
活动将被销毁的那一刻,Disposables列表被清除,我们很好.
io.reactivex.disposables.CompositeDisposable mDisposable;
mDisposable = new CompositeDisposable();
mDisposable.add(
Single.just(db)
.subscribeOn(Schedulers.io())
.subscribe(db -> db.get(1)));
mDisposable.dispose(); // dispose wherever is required
Run Code Online (Sandbox Code Playgroud)
pap*_*eus 12
您可以订阅 DisposableSingleObserver:
Single.just(db)
.subscribeOn(Schedulers.io())
.subscribe(new DisposableSingleObserver<Object>() {
@Override
public void onSuccess(Object obj) {
// work with the resulting todos...
dispose();
}
@Override
public void onError(Throwable e) {
// handle the error case...
dispose();
}});
Run Code Online (Sandbox Code Playgroud)
如果您需要直接处理Single对象(例如在它发出之前),您可以实现方法onSubscribe(Disposable d)来获取和使用Disposable引用。
您也可以SingleObserver自己实现接口或使用其他子类。
如建议的那样,您可以使用一些全局变量CompositeDisposable在其中添加订阅操作的结果。
该RxJava2Extensions库包含有用的方法来自动删除生成一次性从CompositeDisposable它完成时。请参阅subscribeAutoDispose部分。
在您的情况下,它可能看起来像这样
SingleConsumers.subscribeAutoDispose(
Single.just(db)
.subscribeOn(Schedulers.io()),
composite,
db -> db.playerDao().getAll())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29831 次 |
| 最近记录: |