为什么Rxjava会导致内存泄漏

时间:2016-10-05 12:12:36

标签: android memory-leaks rx-java

我正在玩rxjava并发现如果在销毁活动之前未完成订阅,则存在内存泄漏的风险,因为“observables保留对上下文的引用”。如果订阅未取消订阅onDestroyed(来源:https://github.com/dlew/android-subscription-leaks/blob/master/app/src/main/java/net/danlew/rxsubscriptions/LeakingActivity.java),则此类案例的演示之一如下所示:

 @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);
            }
        });
}

但是我不确定为什么会出现这种泄漏。我已经检查了Observable类,并且没有看到与Context相关的内容。所以我能想到的是因为在subscribe方法中定义了一个匿名的Action1类,它包含对活动实例的引用。而观察者反过来也提到了行动。我是对的吗?

由于

1 个答案:

答案 0 :(得分:2)

.subscribe(new Action1<Long>() { })创建并存储nested class,因为任何非静态嵌套类都引用了包含类的实例 - 在本例中为Activity

要解决此问题,您可Subscription.unsubscribe

Activity.onDestroy mSubscription