2017-09-25 5 views
0

私はRxJavaとLeakCanaryを初めて使いました。DisposableCompletableObserverがCompositeDisposableをクリアしていてもアクティビティがリークしています

本質的に私はCompositeDisposableを含むアクティビティを持っています。私は自分のシングルトンリポジトリのインスタンスを取得し、それをに追加するCompletableを得るために使用します。

私は、呼び出し元のオブジェクト(この場合はアクティビティ)のメモリリークを避けるために、私が考えているCompositeDisposableをクリアします。

残念ながら、LeakCanaryをインストールした後、このアクティビティがCompletable経由でリポジトリにリークされたことが報告されます。

私は間違っていますか?それをグーグルで調べると、私は人々がやっている余分なものは見ません。


通常、私は、しかし、この場合には、私はリポジトリへの呼び出しを1つにする必要性を持っている私の設定アクティビティを使用しています、AndroidViewModelを経由して私のリポジトリから、観察を取得します。 ViewModelは不要です。

とにかく、このLeakCanaryによって、アクティビティがリークしたことが分かりました。私がデフォルトで間違っていない場合、私はそれを言わない限り、ViewModelsでこれを行うことはできません。

おそらく他のすべてがリークされていますが、私はそれを認識していません。私はAndroidViewModelの1つを見ただけで、漏れていることも十分に確かめられています(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スクリーンショット:

コメントで述べたように、私はCompositeDisposableを除去することによって、このエラーを解決して

enter image description here

+1

コードを入力してください。 – akarnokd

+0

@akarnokdしました。 –

+0

@akarnokdどのアイデア? –

答えて

0

[OK]をリポジトリから。 RxJavaの新機能私はそれを正しく使う方法を知らなかった。私はサブスクリプションの中でサブスクリプションを持っていたのではなく、1つの観察可能なものを連鎖して返し、連鎖の最後に1回購読した。私。私のリポジトリは実際に何かを購読する必要はありませんでしたが、それはちょうどいくつかのロジックに取り組むか、いくつかの "andThen's"を行うだけでした。

関連する問題