我有以下代码
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
答案 0 :(得分:0)
您无需将一次性用品放置在onSuccess
,onError
那里。
大多数操作员都有自己的观察者。在操作员链接期间创建并连接每个观察者。之后,当您调用subscribe()
时,将在顶级DataSource运算符(例如Single.just()
)中创建一次性对象,并通过每个运算符的ChildObserver.onSubscribe()
回调将其连接到订户。然后,从DataSource开始,检查Disposable.isDisposed()
,然后调用ChildObserver.onSuccessful()
或onError()
回调。
无论如何,Disposable是控制流的接口,并且不会静态地保存资源。如果您自己的逻辑在后台工作,并且结果应用于您在主线程上的视图,则如果Activity的生命周期经过onDestroy()
,则View组件可能无效。因此,通常出于这个原因在此处调用dispose()
。