【问题标题】:DisposableCompletableObserver leaking Activity even though I'm clearing CompositeDisposableDisposableCompletableObserver 泄漏 Activity 即使我正在清除 CompositeDisposable
【发布时间】:2017-09-25 03:11:28
【问题描述】:

我是 RxJava 和 LeakCanary 的新手,所以这可能很简单(希望如此)。

基本上我有一个包含CompositeDisposable 的活动。我获取了我的 Singleton 存储库的实例并使用它来获取添加到 CompositeDisposableCompletable

在 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


【解决方案1】:

好的,正如 cmets 中提到的,我通过从存储库中删除 CompositeDisposable 解决了这个错误。 RxJava 新手,我不知道如何正确使用它。我在订阅中进行了订阅,而不是链接并返回一个 observable,并在链的末尾订阅一次。 IE。我的存储库实际上不需要订阅任何内容,它只需要添加一些逻辑或执行一些“andThen's”。

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 2021-01-25
    • 1970-01-01
    • 2020-11-11
    • 2021-11-19
    • 1970-01-01
    • 2011-04-15
    • 2017-01-12
    相关资源
    最近更新 更多