0
我有一个活动,从网络加载数据,并有一个“重试”按钮,如果请求失败,只是重新进行相同的网络调用。这是简化的代码:如何在失败的情况下重用观察器?
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()
方法中只处理了最后一个,所以会产生泄漏。我的问题是:有没有办法重试/重放这个已经存在的观察者,而不必每次都创建一个新观察者?或者,有没有更好的方法来处理这种情况?
'有没有办法重试/重放同一个观察者:如果它已经完成/失败,那么应该创建一个新的。如果它仍在执行 - 您可以使用'share()'操作符来订阅来自多个订阅的相同观察值。 – azizbekian