gpt4 book ai didi

android - 为什么 Rxjava 会导致内存泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:01:27 25 4
gpt4 key购买 nike

我正在玩 rxjava,发现如果订阅在 Activity 被销毁之前未完成,则存在内存泄漏的风险,因为“可观察对象保留对上下文的引用”。如果订阅未取消订阅 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 类,它持有对 Activity 实例的引用。而 observable 又持有对 Action 的引用。我说得对吗?

谢谢

最佳答案

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

要解决这个问题,您可以 Subscription.unsubscribe mSubscription Activity.onDestroy

关于android - 为什么 Rxjava 会导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39873644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com