如果失败,如何重用观察者?

时间:2017-07-26 11:39:47

标签: android rx-java reactive-programming rx-android rx-java2

我有一个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()方法中正确处理它。

在此代码中,每次单击按钮都会为其创建一个新的Observablesubscribe,从而产生泄漏,因为只有最后一个按钮在onDestroy()方法中被处理掉。我的问题是:有没有办法重试/重播这个已经存在的观察者,而不必每次都创建一个新观察者?或者,这种情况有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

因此,您需要每次都创建一个新的Observable,以避免泄漏问题,您可以创建CompositeDisposable并使用add方法接收调用{后创建的Disposable {1}}。然后在.subscribe()上,只需致电onDestroy(),它就会处置每个未被处置的clear()