web-dev-qa-db-ja.com

レトロフィットとrxjavaでタスクをキャンセルする方法

残りのAPIがあります。

@Get("/serveraction")
public Observable<String> myRequest(@Query("Data") String data);

Okhttpにはキャンセル機能(リクエストオブジェクト、タグ別)があることは知っていますが、retrofitやrxjavaでそれを使用する方法がわかりません。レトロフィットとrxjavaを使用してネットワークタスクのキャンセルメカニズムを実現する最良の方法は何ですか?

20
zella

標準のRxJava2キャンセルメカニズム Disposable を使用できます。

Observable<String> o = retrofit.getObservable(..);
Disposable d = o.subscribe(...);

// later when not needed
d.dispose();

Retrofit RxJava呼び出しアダプタは、これをokHttpのキャンセルにリダイレクトします。

RxJava1: https://github.com/square/retrofit/blob/46dc939a0dfb470b3f52edc88552f6f7ebb49f42/retrofit-adapters/rxjava/src/main/Java/retrofit2/adapter/rxjava/CallArbiter.Java#L50 -L53

RxJava2: https://github.com/square/retrofit/blob/46dc939a0dfb470b3f52edc88552f6f7ebb49f42/retrofit-adapters/rxjava2/src/main/Java/retrofit2/adapter/rxjava2/CallEnqueueObservable.Java#L92 -L95

27

選択された答えはRx Java 1の場合であり、RxJava2の場合は無効です。後者の場合は、Disposableを使用できます。これに従ってください:

  1. クラスのActivityまたはFragmentのフィールドとしてCompositeDisposable compositeDisposable=new CompositeDisposable()を定義します。
  2. 次のようにRetrofit 2を使用してAPIを定義します。

    _public Observable<YourPojo> callApiWithRetrofit() {
        return getService(YourApiService.class).callApi();
    }
    _
  3. Disposableを定義し、compositeDisposableインスタンスに追加します。

    _Disposable disposable = callApiWithRetrofit().subscribeOn(Schedulers.io()).observeOn(
            AndroidSchedulers.mainThread()).subscribeWith(
            new DisposableObserver<List<YourPojo>>() {
                @Override
                protected void onStart() {
                    super.onStart();
                }
    
                @Override
                public void onNext(@NonNull List<AlertAssetDTO> listResponse) {
    
                }
    
                @Override
                public void onError(@NonNull Throwable e) {
    
                }
    
                @Override
                public void onComplete() {
    
                }
            });
    mCompositeDisposable.add(alertAssetsDisposable);
    _
  4. 接続をキャンセルしたい場所(たとえば、ActivityonDestroy()メソッドまたはFragmentonDestroyView())でmCompositeDisposable.clear();を呼び出します。

この方法で、複数の使い捨て部品をCompostieDisposableに追加できます。

4
Ali Nem