2017-12-13 8 views
0

ネットワーク要求を処理するためにRxJava2とRetrofit2を使用しています。廃棄がネットワーク要求をキャンセルするのを防ぐ

私はいつもdoOnNextを実行する必要がありますが、オブザーバーであるActivityが破壊され、その要求を取り消すためにdispose()が呼び出されます。

java.io.IOException: Canceled 

リクエストを完了させてUIレベルのオブザーバーのみを廃棄する方法はありますか?

mApi.doSomethingImportant() 
    .doOnNext(new Consumer<ImportantResponse>() { 
     @Override 
     public void accept(ImportantResponse response) throws Exception { 
      // Store data, should always get here if request is success 
     } 
    }) 
    .doOnError(new Consumer<Throwable>() { 
     @Override 
     public void accept(Throwable throwable) throws Exception { 
      // Store error, should always get here if request fails 
     } 
    }) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .unsubscribeOn(AndroidSchedulers.mainThread()) 
    .subscribe(observer); // observer reports success/fail on UI if not disposed 

ありがとうございます。

+0

あなたは私たちに最低限、完全な例を示していることはできますか?あなたの質問にもっと簡単に答えることができます。 –

答えて

0

オブザーバーを別のものにラッピングすることで、望ましい動作を実現する方法が見つかりましたが、これを行うにはいくつかのエレガントな方法があります。

... 
.subscribe(new NonDisposableObserver<>(observer) 

どこNonDisposableObserverクラス以下の通りです:

public class NonDisposableObserver<T> implements Observer<T> { 

    private DisposableObserver<T> observer; 

    public NonDisposableObserver(DisposableObserver<T> observer) { 
     this.observer = observer; 
    } 

    @Override 
    public void onSubscribe(Disposable d) { 
    } 

    @Override 
    public void onNext(T t) { 
     if (!observer.isDisposed()) { 
      observer.onNext(t); 
     } 
    } 

    @Override 
    public void onError(Throwable e) { 
     if (!observer.isDisposed()) { 
      observer.onError(e); 
     } 
    } 

    @Override 
    public void onComplete() { 
     if (!observer.isDisposed()) { 
      observer.onComplete(); 
     } 
    } 
} 
関連する問題