155 votes

Le résultat de subscribe n'est pas utilisé

J'ai mis à niveau vers Android Studio 3.1 aujourd'hui, qui semble avoir ajouté un peu plus de charpie contrôles. L'une de ces peluches de contrôle, one-shot RxJava2 subscribe() des appels qui ne sont pas stockées dans une variable. Par exemple, obtenir une liste de tous les joueurs de ma Chambre de la base de données:

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

Résultats dans un gros bloc jaune et cette info-bulle:

Le résultat de l' subscribe n'est pas utilisé

Screenshot of Android Studio. Code is highlighted in Yellow with a tooltip. Tooltip text: The result of subscribe is not used.

Quelle est la meilleure pratique pour les one-shot Rx appelle comme ça? Dois-je garder l' Disposable et dispose() sur complet? Ou devrais-je juste @SuppressLint et avancer?

Cela ne semble affecter RxJava2 (io.reactivex), RxJava (rx) n'a pas cette fibre.

153voto

urgentx Points 2164

L'IDE ne sais pas ce que les effets potentiels de votre abonnement peut avoir quand il n'est pas éliminé, il le traite comme potentiellement dangereux. Par exemple, votre Single peut contenir un appel réseau, ce qui pourrait provoquer une fuite de mémoire si votre Activity est abandonné au cours de son exécution.

Un moyen pratique de gérer une grande quantité d' Disposables est d'utiliser un CompositeDisposable; il suffit de créer un nouveau CompositeDisposable variable d'instance de votre classe englobante, puis ajouter tous vos Consommables pour le CompositeDisposable (avec RxKotlin vous pouvez simplement ajouter addTo(compositeDisposable) pour l'ensemble de vos Consommables). Enfin, lorsque vous avez terminé avec votre instance, appel compositeDisposable.dispose().

Cela permettra de se débarrasser de la fibre de mises en garde, et vous assurer que votre Disposables sont gérés correctement.

Dans ce cas, le code devrait ressembler à:

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

27voto

Aks4125 Points 2326

Au moment où l'activité sera détruite, la liste des produits jetables sera effacée et tout ira 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
 

15voto

papandreus Points 93

Vous pouvez vous inscrire avec 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();
            }});

Dans le cas où vous avez besoin de disposer Single objet (par exemple, avant qu'il émet), vous pouvez mettre en œuvre la méthode onSubscribe(Disposable d) d'obtenir et d'utiliser l' Disposable de référence.

Vous pouvez également réaliser SingleObserver interface par votre propre ou utiliser d'autres classes enfant.

5voto

httpdispatch Points 2236

Comme on l'a suggéré, vous pouvez utiliser certaines régions du globe CompositeDisposable pour ajouter le résultat de l'subscribe de fonctionnement.

Le RxJava2Extensions bibliothèque contient des méthodes utiles pour supprimer automatiquement créé jetables à partir de l' CompositeDisposable lorsqu'elle est terminée. Voir subscribeAutoDispose section.

Dans votre cas, il peut ressembler à ceci

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

2voto

blaffie Points 157

Vous pouvez utiliser Uber AutoDispose et rxjava .as

         Single.just(db)
            .subscribeOn(Schedulers.io())
            .as(AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(this)))
            .subscribe(db -> db.playerDao().getAll());
 

Assurez-vous de bien comprendre quand vous vous désabonnez en vous basant sur ScopeProvider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X