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''
}}