为什么Rxjava可能导致内存泄漏

H.N*_*yen 5 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);
            }
        });
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

mie*_*sol 3

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

要解决这个问题,您可以Subscription.unsubscribemSubscriptionActivity.onDestroy