我有一个Activity,它从网络加载数据,如果请求失败,只有重新进行相同的网络调用,则会有一个“重试”按钮。这是简化的代码:
public class MainActivity extends Activity {
private DisposableObserver<Data> disposableObserver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadData();
}
});
}
private void loadData() {
disposableObserver = control.fetchFromNetwork().subscribeWith(new DisposableObserver<Data>() {
@Override
public void onNext(Data data) {
updateUI(data);
}
@Override
public void onError(Throwable throwable) {
showError();
}
@Override
public void onComplete() {
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
if (disposableObserver != null && !disposableObserver.isDisposed()) {
disposableObserver.dispose();
}
}
}
对于它的价值,这是创建Observer
:
public Observable<Data> fetchFromNetwork() {
return getService().fetchdata()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(new Consumer<Throwable>() {
@Override
public void accept(Throwable t) throws Exception {
exceptionHandler.handle(t);
}
});
}
我正在使用DisposableObserver
,因此可以在活动的onDestroy()
方法中正确处理它。
在此代码中,每次单击按钮都会为其创建一个新的Observable
和subscribe
,从而产生泄漏,因为只有最后一个按钮在onDestroy()
方法中被处理掉。我的问题是:有没有办法重试/重播这个已经存在的观察者,而不必每次都创建一个新观察者?或者,这种情况有更好的方法吗?
答案 0 :(得分:0)
因此,您需要每次都创建一个新的Observable
,以避免泄漏问题,您可以创建CompositeDisposable
并使用add
方法接收调用{后创建的Disposable {1}}。然后在.subscribe()
上,只需致电onDestroy()
,它就会处置每个未被处置的clear()
。