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 次  |  
        
|   最近记录:  |