Je suis passé à Android Studio 3.1 aujourd'hui, ce qui semble avoir ajouté quelques autres contrôles de peluches. L'un de ces contrôles de charpie concerne les subscribe()
appels RxJava2 ponctuels qui ne sont pas stockés dans une variable. Par exemple, obtenir une liste de tous les joueurs à partir de la base de données de ma salle:
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
subscribe
n'est pas utilisé
Quelle est la meilleure pratique pour les appels Rx one-shot comme celui-ci? Dois-je garder la main sur Disposable
et dispose()
à la fin? Ou devrais-je simplement @SuppressLint
passer à autre chose?
Cela semble n'affecter que RxJava2 ( io.reactivex
), RxJava ( rx
) n'a pas cette charpie.
android
android-studio
rx-java2
lint
android-studio-3.1
Michael Dodd
la source
la source
Disposable
portée des membres et j'appelledispose()
lorsque le single se termine, mais cela semble inutilement encombrant. Je suis intéressé de voir s'il existe de meilleures façons de faire cela.Réponses:
L'EDI ne sait pas quels effets potentiels votre abonnement peut avoir lorsqu'il n'est pas supprimé, il le traite donc comme potentiellement dangereux. Par exemple, votre
Single
peut contenir un appel réseau, ce qui pourrait provoquer une fuite de mémoire si votreActivity
est abandonné pendant son exécution.Un moyen pratique de gérer une grande quantité de
Disposable
s consiste à utiliser un CompositeDisposable ; créez simplement une nouvelleCompositeDisposable
variable d'instance dans votre classe englobante, puis ajoutez tous vos objets jetables au CompositeDisposable (avec RxKotlin, vous pouvez simplement ajouteraddTo(compositeDisposable)
à tous vos objets jetables). Enfin, lorsque vous avez terminé avec votre instance, appelezcompositeDisposable.dispose()
.Cela éliminera les avertissements de peluche et garantira que vous
Disposables
êtes bien géré.Dans ce cas, le code ressemblerait à:
la source
error: cannot find symbol method addTo(CompositeDisposable)
J'obtiens une erreur de compilation avec "rxjava: 2.1.13". D'où vient cette méthode? (RxSwift ou RxKotlin je suppose)Au moment où l'activité sera détruite, la liste des produits jetables est effacée et tout va bien.
la source
Vous pouvez vous abonner avec DisposableSingleObserver :
Au cas où vous auriez besoin de supprimer directement l'
Single
objet (par exemple avant qu'il ne soit émis), vous pouvez implémenter une méthodeonSubscribe(Disposable d)
pour obtenir et utiliser laDisposable
référence.Vous pouvez également réaliser l'
SingleObserver
interface par vous-même ou utiliser d'autres classes enfants.la source
Comme cela a été suggéré, vous pouvez utiliser un global
CompositeDisposable
pour y ajouter le résultat de l'opération d'abonnement.La bibliothèque RxJava2Extensions contient des méthodes utiles pour supprimer automatiquement les éléments jetables créés du
CompositeDisposable
. Voir la section subscribeAutoDispose .Dans votre cas, cela peut ressembler à ceci
la source
Vous pouvez utiliser Uber AutoDispose et rxjava
.as
Assurez-vous que vous comprenez quand vous vous désabonnez en fonction du ScopeProvider.
la source
Je reviens encore et encore à la question de savoir comment disposer correctement des abonnements, et à cette publication en particulier. Plusieurs blogs et conférences affirment que le fait de ne pas appeler
dispose
conduit nécessairement à une fuite de mémoire, ce que je pense être une déclaration trop générale. À mon avis, l'avertissement de non-stockage du résultatsubscribe
est un non-problème dans certains cas, car:Comme je ne veux pas supprimer les avertissements de charpie, j'ai récemment commencé à utiliser le modèle suivant pour les cas avec une observable synchrone:
Je serais intéressé par tout commentaire à ce sujet, qu'il s'agisse d'une confirmation de l'exactitude ou de la découverte d'une échappatoire.
la source
Il existe un autre moyen disponible, qui évite d'utiliser les produits jetables manuellement (ajouter et supprimer des abonnements).
Vous pouvez définir un observable et cet observable recevra le contenu d'un SubjectBehaviour (au cas où vous utiliseriez RxJava). Et en passant cet observable à votre LiveData , cela devrait fonctionner. Découvrez l'exemple suivant basé sur la question initiale:
la source
Si vous êtes sûr que le jetable est géré correctement, par exemple en utilisant l'opérateur doOnSubscribe (), vous pouvez ajouter ceci à Gradle:
la source
@SuppressLint("CheckResult")
uniquement la méthode.