【发布时间】:2017-09-25 03:11:28
【问题描述】:
我是 RxJava 和 LeakCanary 的新手,所以这可能很简单(希望如此)。
基本上我有一个包含CompositeDisposable 的活动。我获取了我的 Singleton 存储库的实例并使用它来获取添加到 CompositeDisposable 的 Completable。
在 onPause 中,我清除了 CompositeDisposable,我相信这将避免调用对象(在本例中为 Activity)的任何内存泄漏。
不幸的是,在安装 LeakCanary 后,它通过Completable 报告此 Activity 在存储库中泄漏。
我做错了什么?谷歌搜索时,我没有看到人们在做什么。
注意:
通常我会通过AndroidViewModel 从我的存储库中获得一个 observable,但是在这种情况下,我使用的是我的设置活动,它需要对存储库进行一次调用。它不需要 ViewModel。
无论如何,因为这个 LeakCanary 能够注意到 Activity 被泄露了。如果我没记错的话,除非我告诉它,否则它无法在我的 ViewModel 上执行此操作。
所以也许其他所有内容都被泄露了,但我只是不知道。好的,我刚刚看了我的一个 AndroidViewModel,果然它也被泄露了(根据 LeakCanary)。看来要么我做错了,要么 LeakCanary 显示误报。
任何帮助表示赞赏。 谢谢。
请求的代码(更新):
private CompositeDisposable mSubscriptions;
@Override
public void onCreate(Bundle savedInstanceState) {
...
mSubscriptions = new CompositeDisposable();
...
}
@Override
protected void onPause() {
super.onPause();
mSubscriptions.clear();
}
public void someMethodForButtonClick(View view) {
IwcRepository iwcRepository =
Injection.provideIwcRepository(getApplication());
mSubscriptions.add(iwcRepository.getSomeCompletable()
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableCompletableObserver() {
@Override
public void onComplete() {
}
@Override
public void onError(@NonNull Throwable e) {
}
}));
}
LeakCanary 截图:
【问题讨论】:
-
请提供一些代码。
-
@akarnokd 完成。
-
@akarnokd 有什么想法吗?
-
当你拍摄泄漏金丝雀快照时,它是否会调用 GC 来清理无法访问的引用?拍摄快照之前应用是否已暂停?
-
在
subscribeWith之前尝试onTerminateDetach以排除您的来源保留对其订阅者的引用。
标签: android rx-java2 leakcanary