【问题标题】:Disposing a PublishSubject object in RxJava | Memory Leak在 RxJava 中处理 PublishSubject 对象内存泄漏
【发布时间】:2020-07-20 16:57:52
【问题描述】:

在 Java 中使用 PublishSubject 而不是 Observables 时,在分析过程中我会因此而出现内存泄漏。我没有看到任何相关的一次性用品。

在主题上调用 onComplete() 会处理它并解决问题吗?

我们还能做些什么来解决内存泄漏?

有什么想法吗?

【问题讨论】:

  • 使用一次性复合材料并清除它怎么样。
  • [history]:你用的是disposable那么没什么,你可以试试在subject上调用onComplete()

标签: java android memory-leaks rx-java dispose


【解决方案1】:

我的第一个建议总是尝试使用 Observables 而不是 Subjects;但是,当需要使用主题时,您可以使用 CompositeDisposable 组件或通过 生命周期挂钩 手动取消订阅,如下所示:

    public class TakeSubscriptionsActivity extends AppCompatActivity {

    public static String TAG = "TakeSubscriptionsActivity";
    private Subject<Boolean> cancel = PublishSubject.create();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_take_subscriptions);

        Observable.interval(1, TimeUnit.SECONDS)
                .takeUntil(cancel)
                .subscribe(element -> Log.d(TAG, "" + element));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        cancel.onNext(true);
        cancel.onComplete();
    }
}

【讨论】: