2017-09-25 38 views
0

我是RxJava和LeakCanary的新手,因此这可能是简单的事情(希望)。DisposableCompletableObserver泄漏即使我正在清除CompositeDisposable

基本上我有一个活动,其中包括一个CompositeDisposable。我得到了我的Singleton存储库的实例,并使用它来获取Completable,并将其添加到CompositeDisposable

在onPause中,我清除了CompositeDisposable,这让我相信会避免调用对象(在本例中为Activity)的任何内存泄漏。

不幸的是,在安装LeakCanary之后,它会通过Completable报告此活动在存储库中泄漏。

我在做什么错?当用谷歌搜索时,我没有看到任何额外的人在做什么。


注意

通常我从我的仓库可观察到的通过AndroidViewModel,但是在这种情况下,我使用它有一个要求我设置的活动,使一个调用库。它不需要ViewModel。

无论如何,因为这个LeakCanary能够注意到活动被泄露。如果我没有错误的默认情况下,它将无法在我的ViewModels上做到这一点,除非我告诉它。

所以也许其他一切都被泄漏,但我只是没有意识到它。好吧,我只是看了我的一个AndroidViewModel,并确信它也被泄露(根据LeakCanary)。看来无论我做错了什么,或者LeakCanary都表现出误判。

任何帮助表示赞赏。 谢谢。根据要求


代码(更新):

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截图:

enter image description here

+1

请提供一些代码。 – akarnokd

+0

@akarnokd完成。 –

+0

@akarnokd有什么想法? –

回答

0

好,以便在评论中提到我通过移除CompositeDisposable解决这个错误从存储库中。 RxJava新手我不知道如何正确使用它。我在订阅中订阅了订阅,而不是链接并返回一个观察者,并在链的末尾订阅一次。即我的存储库实际上并不需要订阅任何内容,只需要加入一些逻辑或做一些“然后”。