web-dev-qa-db-fra.com

Meilleure pratique pour éliminer les observables Completable, Single, Maybe et de terminaison dans RxJava

Je pose cette question dans une perspective Android, mais cela devrait s'appliquer à RxJava en général.

En tant que meilleure pratique, si ma vue doit toujours disposer même de courte durée Completable, Single, Maybe et se terminant Observable types Rx qui doivent terminer en peu de temps, mais pourrait-il toujours être en cours d'exécution lorsque l'utilisateur ferme la vue? Je sais que lorsque la chaîne Rx se termine, elle est supprimée, mais cela peut potentiellement se produire quelque temps après la fermeture de la vue.

Par exemple, un Single qui exécute un HTTP GET. L'appel se terminera, mais il se peut que la vue soit détruite, ce qui empêche temporairement la récupération de place.

Et si un CompositeDisposable est utilisé pour collecter de tels Disposables dans une vue de longue durée, je pense qu'il faudrait faire attention à clear() ou autrement supprimer ces Disposables régulièrement pour empêcher une croissance illimitée de la taille de CompositeDisposable?

18
HolySamosa

En tant que meilleure pratique, si mon point de vue devait toujours éliminer les types Rx observables, même de courte durée, à durée de vie unique, peut-être et à terminaison

Si vous partagez le code avec d'autres, comme meilleure pratique, je vais dire oui, vous devez vous en débarrasser. Bien que cela puisse sembler une plaque de chaudière supplémentaire, cela empêchera le prochain développeur d'essayer de se connecter au code de votre abonnement et d'essayer d'accéder à des composants qui peuvent ne plus exister (c'est-à-dire un Context après un Fragment est détaché ... etc).

Et si un CompositeDisposable est utilisé pour collecter ces objets jetables dans une vue à longue durée de vie, je pense qu'il faudrait prendre soin de supprimer () ou de supprimer ces éléments jetables régulièrement pour éviter une croissance illimitée de la taille de CompositeDisposable?

Je tiens à souligner que dans rxjava2, CompositeDisposables ont un état; une fois que vous appelez dispose(), tout Disposable ajouté sera immédiatement supprimé. Donc, comme meilleure pratique:

  1. créer un nouveau CompositeDisposable au début du cycle de vie (onCreate(...) etc)
  2. prenez soin de dispose() dans onDestroy(...) car à ce stade, votre rappel n'a pratiquement plus de valeur et se contente de conserver des ressources.
10
Jon

Il est recommandé de supprimer CompositeDisposable dans onPause ou onDestroy pour éviter de tels problèmes.

3
Benjamin