是否需要处置SingleObserver?如果是这样,在哪里?

时间:2019-12-15 10:28:01

标签: android memory-leaks rx-java2 rx-android reactivex

我有以下代码

Single.just(settings.toString())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new SingleObserver<String>() {
    private Disposable disposable;
    @Override public void onSubscribe(Disposable d) {
        this.disposable = d;
    }
    @Override public void onSuccess(String s) {
        webViewFragment.onInjectMessage(s, null);
        this.disposable.dispose();
    }
    @Override public void onError(Throwable e) {
        this.disposable.dispose();
    }
});

我在后台线程中,需要将字符串注入WebView,这只能在主线程上完成,这就是为什么我要调用.observeOn(AndroidSchedulers.mainThread()

但是,当我阅读SingleObserver on GitHub的示例代码时,会看到以下内容:

return new SingleObserver<String>() {
    @Override public void onSubscribe(Disposable d) {
        Log.d(TAG, " onSubscribe : " + d.isDisposed());
    }
    @Override public void onSuccess(String value) {
        textView.append(" onNext : value : " + value);
        textView.append(AppConstant.LINE_SEPARATOR);
        Log.d(TAG, " onNext value : " + value);
    }
    @Override public void onError(Throwable e) {
        textView.append(" onError : " + e.getMessage());
        textView.append(AppConstant.LINE_SEPARATOR);
        Log.d(TAG, " onError : " + e.getMessage());
    }
};

他们没有处置SingleObserver

我是否需要在this.disposable.dispose();和/或onSuccess中调用onError(两者?还是只在onSuccess中调用?) ,如GitHub示例所示?

我是在内存泄漏的情况下问这个的。

这个问题的根源是RxAndroid `Observable...subscribe` highlighted in Android Studio

1 个答案:

答案 0 :(得分:0)

您无需将一次性用品放置在onSuccessonError那里。

大多数操作员都有自己的观察者。在操作员链接期间创建并连接每个观察者。之后,当您调用subscribe()时,将在顶级DataSource运算符(例如Single.just())中创建一次性对象,并通过每个运算符的ChildObserver.onSubscribe()回调将其连接到订户。然后,从DataSource开始,检查Disposable.isDisposed(),然后调用ChildObserver.onSuccessful()onError()回调。

无论如何,Disposable是控制流的接口,并且不会静态地保存资源。如果您自己的逻辑在后台工作,并且结果应用于您在主线程上的视图,则如果Activity的生命周期经过onDestroy(),则View组件可能无效。因此,通常出于这个原因在此处调用dispose()