不使用订阅的结果

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未使用

Android Studio的屏幕截图. 代码以黄色突出显示,带有工具提示. 工具提示文本:未使用订阅结果.

这样的一次性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)

  • 它不会导致内存泄漏。一旦网络调用完成并且 onComplete 被调用,垃圾收集将处理其余的事情,除非您保留了一次性的显式引用并且不处理它。 (3认同)
  • 是的,这是一个RxKotlin方法. (2认同)

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自己实现接口或使用其他子类。


htt*_*tch 5

如建议的那样,您可以使用一些全局变量CompositeDisposable在其中添加订阅操作的结果。

RxJava2Extensions库包含有用的方法来自动删除生成一次性从CompositeDisposable它完成时。请参阅subscribeAutoDispose部分。

在您的情况下,它可能看起来像这样

SingleConsumers.subscribeAutoDispose(
    Single.just(db)
            .subscribeOn(Schedulers.io()),
    composite,
    db -> db.playerDao().getAll())
Run Code Online (Sandbox Code Playgroud)