【问题标题】:Does a SingleObserver need to be disposed? If so, where?是否需要处置 SingleObserver?如果有,在哪里?
【发布时间】:2019-12-15 10:28:01
【问题描述】:

我有以下代码

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

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

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

这个问题源于RxAndroid `Observable...subscribe` highlighted in Android Studio

【问题讨论】:

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


    【解决方案1】:

    您不需要在那里处理一次性用品:onSuccessonError

    大多数运营商都有自己的观察员。每个 Observer 都是在 Operator Chaining 期间创建和连接的。之后,当您调用subscribe() 时,会在顶级DataSource Operator(例如Single.just())中创建disposable,并通过每个operator 的ChildObserver.onSubscribe() 回调连接到订阅者。然后,从 DataSource 开始,检查Disposable.isDisposed(),并调用ChildObserver.onSuccessful()onError() 回调。

    无论如何,Disposable 是一个控制流的接口,不会静态持有资源。如果你自己的逻辑在后台运行,结果应用到你在主线程上的视图,如果 Activity 的生命周期经过onDestroy(),视图组件可能无效。所以,一般情况下会在那儿打电话给dispose()

    【讨论】:

      猜你喜欢
      • 2011-03-31
      • 2010-12-20
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2021-05-13
      • 1970-01-01
      相关资源
      最近更新 更多