2017-07-26 67 views
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()方法。

在这段代码中,每次按钮点击都会为它创建一个新的Observablesubscribe,由于在onDestroy()方法中只处理了最后一个,所以会产生泄漏。我的问题是:有没有办法重试/重放这个已经存在的观察者,而不必每次都创建一个新观察者?或者,有没有更好的方法来处理这种情况?

+0

'有没有办法重试/重放同一个观察者:如果它已经完成/失败,那么应该创建一个新的。如果它仍在执行 - 您可以使用'share()'操作符来订阅来自多个订阅的相同观察值。 – azizbekian

回答

0

所以,你需要创建一个新的Observable每一次,以避免泄漏问题,您可以创建一个CompositeDisposable和使用接收一次性调用.subscribe()之后创建的add方法。然后在onDestroy()只需拨打clear(),它会处置每个没有处置的Disposable

相关问题