web-dev-qa-db-fra.com

Est-il obligatoire de vous retirer en tant qu'observateur de Android Lifecycle?

Je construis une Android Java qui implémente l'interface LifecycleObserver ).

Voici le constructeur:

public MyObserver(AppCompatActivity activity) {
    this.mActivity = new WeakReference<AppCompatActivity>(activity);
    activity.getLifecycle().addObserver(this);
}

Est-il nécessaire d'appeler jamais removeObserver , en utilisant quelque chose comme:

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void destroyListener() {
    if (this.mActivity.get() != null) {
        this.mActivity.get().getLifecycle().removeObserver(this);
    }
}

Ou puis-je observer pour toujours?

18
esilver

TL; DR: Non.

Selon cela lien ici , où un utilisateur a posé votre question sur le Android-lifecycles Repo Github. La réponse d'un développeur de Google à ces questions était:

Oui, c'est tout l'intérêt des nouveaux composants sensibles au cycle de vie, pas besoin de se désinscrire/supprimer des observateurs.

19
TareK Khoury

TL; DR: Vous feriez mieux de supprimer explicitement l'observateur lorsque vous en avez terminé, ou d'utiliser quelque chose qui gère cela automatiquement, comme LiveData.

Lifecycle est une classe abstract. Donc, techniquement, vous n'avez aucune idée de l'implémentation et des règles du jeu.

L'un concret Lifecycle est LifecycleRegistry. Il a de fortes références aux observateurs. Alors maintenant, vous comptez sur le LifecycleRegistry être récupéré en temps opportun, par exemple lorsque l'activité est détruite. Pour FragmentActivity, cela semble être le cas. Donc, dans la pratique, pour la version actuelle de tout cela, vous pouvez vous en sortir sans désinscrire l'observateur et subir le moins d'effets indésirables, le cas échéant.

Mais cela ne fait pas partie du contrat Lifecycle. Sans doute, toute implémentation décente de Lifecycle (ou des choses qui utilisent LifecycleRegistry) devrait gérer proprement le cas où vous ne vous désenregistrez pas ... mais je ne risquerais pas il.

5
CommonsWare

J'utilise LifecycleRegistry dans un objet singleton qui gère les sons audio. Après avoir ajouté LeakCanary, il a détecté une fuite de mémoire en raison de ce problème.

Cependant, en appelant removeObserver, la fuite de mémoire n'est plus apparue.

Il peut donc être vrai que lorsque vous utilisez LiveData + LifecycleRegistry, vous n'avez pas besoin de vous désinscrire. Mais s'il s'agit d'un composant personnalisé utilisant LifecycleRegistry, mon expérience montre que l'appel à removeObserver est indispensable pour éviter les fuites de mémoire.

0
Vito Valov