【发布时间】:2017-02-13 21:06:32
【问题描述】:
我正在使用 rxjava,发现如果在销毁活动之前未完成订阅,则存在内存泄漏的风险,因为“可观察对象保留对上下文的引用”。如果订阅未取消订阅 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 类,它持有对活动实例的引用。而 observable 又持有对动作的引用。我说的对吗?
谢谢
【问题讨论】:
-
仅供参考,我创建了一个插件,在详细的 HTML 报告中显示泄露的一次性订阅列表。在媒体上发帖:Detect Leaked Subscriptions in RxJava code using RxDisposableWatcher
标签: android memory-leaks rx-java