2017-09-25 17 views
0

Je suis nouveau sur RxJava et LeakCanary, donc cela pourrait être quelque chose de simple (j'espère).JetableCompletableObserver fuite d'activité même si j'efface CompositeDisposable

Essentiellement, j'ai une activité qui comprend un CompositeDisposable. Je reçois l'instance de mon référentiel Singleton et l'utilise pour obtenir un Completable qui est ajouté au CompositeDisposable.

Dans onPause, j'efface le CompositeDisposable qui, selon ce que je pense, évitera toute fuite de mémoire de l'objet appelant (dans ce cas, une activité).

Malheureusement, après l'installation de LeakCanary, il signale que cette activité est divulguée dans le référentiel via le Completable.

Qu'est-ce que je fais mal? Quand je le google, je ne vois rien d'extra que les gens font.


Remarque:

Normalement, je reçois une observable de mon dépôt via un AndroidViewModel, mais dans ce cas j'utilise mon activité Paramètres qui a une obligation de faire un appel au référentiel. Il ne nécessite pas de ViewModel.

Quoi qu'il en soit, à cause de cela, LeakCanary a pu remarquer que l'activité avait été divulguée. Si je ne me trompe pas par défaut, il ne serait pas capable de le faire sur mes ViewModels à moins que je ne le leur dise.

Alors peut-être que tout le reste est également divulgué, mais je ne suis tout simplement pas au courant. Ok, je viens de regarder l'un de mes AndroidViewModel et bien sûr qu'il fuit aussi (selon LeakCanary). Il semble que je fasse quelque chose de mal ou que LeakCanary montre un faux positif.

Toute aide appréciée. Merci.


code tel que demandé (mise à jour):

private CompositeDisposable mSubscriptions; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    mSubscriptions = new CompositeDisposable(); 
    ... 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    mSubscriptions.clear(); 
} 

public void someMethodForButtonClick(View view) { 
    IwcRepository iwcRepository = 
    Injection.provideIwcRepository(getApplication()); 
    mSubscriptions.add(iwcRepository.getSomeCompletable() 
      .subscribeOn(Schedulers.computation()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeWith(new DisposableCompletableObserver() { 
       @Override 
       public void onComplete() { 

       } 

       @Override 
       public void onError(@NonNull Throwable e) { 

       } 
      })); 
} 

LeakCanary Screenshot:

enter image description here

+1

Veuillez fournir du code. – akarnokd

+0

@akarnokd fait. –

+0

@akarnokd des idées? –

Répondre

0

Ok, donc comme mentionné dans les commentaires que je résolus cette erreur en supprimant le CompositeDisposable à partir du référentiel. Nouveau sur RxJava, je ne savais pas comment l'utiliser correctement. J'avais des abonnements à l'intérieur des abonnements plutôt que de chaîner et de renvoyer un observable, et de m'abonner une fois à la fin de la chaîne. C'est à dire. mon référentiel n'avait pas vraiment besoin de s'abonner à quoi que ce soit, il fallait juste coller sur une logique ou faire un peu de "andThen".