我正在玩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类,它包含对活动实例的引用。而观察者反过来也提到了行动。我是对的吗?
由于
答案 0 :(得分:2)
.subscribe(new Action1<Long>() { })
创建并存储nested class,因为任何非静态嵌套类都引用了包含类的实例 - 在本例中为Activity
。
要解决此问题,您可Subscription.unsubscribe
Activity.onDestroy
mSubscription