2016-10-05 16 views
4

私はrxjavaで遊んでいて、 "observablesがコンテキストへの参照を保持している"ため、アクティビティが破棄される前にサブスクリプションが完了していないとメモリリークのリスクがあることがわかりました。私は、このようなリークが存在する理由はわからないがRxjavaがメモリリークを引き起こす理由

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_leaking); 

    // This is a hot Observable that never ends; 
    // thus LeakingActivity can never be reclaimed 
    mSubscription = Observable.interval(1, TimeUnit.SECONDS) 
     .subscribe(new Action1<Long>() { 
      @Override public void call(Long aLong) { 
       Timber.d("LeakingActivity received: " + aLong); 
      } 
     }); 
} 

:サブスクリプションが解除onDestroyed(:https://github.com/dlew/android-subscription-leaks/blob/master/app/src/main/java/net/danlew/rxsubscriptions/LeakingActivity.javaソース)でない場合は、このような場合のためのデモの一つは、以下のように与えられます。私はObservableクラスをチェックして、Contextには関係のないものを見た。だから私が考えることができるのは、アクティビティインスタンスへの参照を保持するsubscribeメソッド内に定義された匿名のAction1クラスがあるからです。そして観察可能なものは、その行動への言及を保持する。私は正しい?

おかげ

答えて

2

.subscribe(new Action1<Long>() { })は、任意の非静的な入れ子になったクラスとしてクラスインスタンスをcontaingを参照有しnested class作成して格納する - この場合Activityを。

も確認する `mSubscription`をゼロあなたが Activity.onDestroy

+0

mSubscriptionSubscription.unsubscribeできることを解決するために。 – akarnokd

関連する問題