我有以下一段代码
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()
然而,当我在 GitHub 上通读SingleObserver
的示例代码时,我看到以下内容:
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的"可观察的...订阅"在安卓工作室中突出显示
你不需要在那里处理一次性物品:onSuccess
,onError
。
大多数操作员都有自己的观察器。每个观察程序都是在运算符链期间创建和连接的。之后,当您调用subscribe()
时,将在顶级数据源运算符(例如Single.just()
(中创建一次性,并通过每个运算符的ChildObserver.onSubscribe()
回调连接到订阅者。然后,从数据源开始,选中Disposable.isDisposed()
,并调用ChildObserver.onSuccessful()
或onError()
回调。
无论如何,一次性是控制流的接口,不会静态保存资源。如果您自己的逻辑在后台工作,并且结果应用于主线程上的视图,则当活动的生命周期经过onDestroy()
时,View 组件可能无效。因此,出于这个原因,通常在那里打电话给dispose()
。