android android-studio rx-java2 lint android-studio-3.1

android - El resultado de la suscripción no se usa



android-studio rx-java2 (5)

Como se sugirió, puede usar un CompositeDisposable global para agregar el resultado de la operación de suscripción allí.

La biblioteca RxJava2Extensions contiene métodos útiles para eliminar automáticamente los elementos desechables creados de CompositeDisposable cuando se completa. Consulte la sección subscribeAutoDispose .

En su caso, puede verse así

SingleConsumers.subscribeAutoDispose( Single.just(db) .subscribeOn(Schedulers.io()), composite, db -> db.playerDao().getAll())

Hoy he actualizado a Android Studio 3.1, que parece haber agregado algunas comprobaciones de pelusas más. Una de estas comprobaciones de pelusa es para llamadas de subscribe() única RxJava2 de una sola vez que no están almacenadas en una variable. Por ejemplo, obtener una lista de todos los jugadores de la base de datos de mi sala:

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

Resultados en un gran bloque amarillo y esta información sobre herramientas:

El resultado de la subscribe no se usa

¿Cuál es la mejor práctica para llamadas Rx one-shot como esta? ¿Debo mantener el Disposable y dispose() por completo? ¿O debería simplemente @SuppressLint y seguir adelante?

Esto solo parece afectar a RxJava2 ( io.reactivex ), RxJava ( rx ) no tiene esta pelusa.


El IDE no sabe qué efectos potenciales puede tener su suscripción cuando no se elimina, por lo que la trata como potencialmente insegura. Por ejemplo, su Single puede contener una llamada de red, lo que podría causar una pérdida de memoria si su Activity se abandona durante su ejecución.

Una manera conveniente de administrar una gran cantidad de Disposable es usar un CompositeDisposable ; simplemente cree una nueva variable de instancia CompositeDisposable en su clase adjunta, luego agregue todos sus Desechables a CompositeDisposable (con RxKotlin puede agregar addTo(compositeDisposable) a todos sus Desechables). Finalmente, cuando haya terminado con su instancia, llame a compositeDisposable.dispose() .

Esto eliminará las advertencias de pelusa y garantizará que sus Disposables se administren correctamente.

En este caso, el código se vería así:

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()).


En el momento en que se destruya la Actividad, la lista de Desechables se borra y estamos bien.

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


Puede suscribirse con 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(); }});

En caso de que necesite deshacerse directamente de un Single objeto (por ejemplo, antes de que se emita), puede implementar el método onSubscribe(Disposable d) para obtener y usar la referencia Disposable .

También puede realizar la interfaz SingleObserver por su cuenta o utilizar otras clases secundarias.


Si está seguro de que el desechable se manejó correctamente, por ejemplo, utilizando el operador doOnSubscribe (), puede agregar esto a Gradle:

android { lintOptions { disable ''CheckResult'' }}