OkHttp2.7.0でRetrofit2-beta2を使用しています。
RetrofitからOkHttpClient
オブジェクトを取得するには、 Retrofit .client() メソッドを使用しており、実行中のすべてのリクエストをキャンセルするには、 cancel(Object tag) メソッドですが、リクエストは引き続き実行され、応答が返されます。
クライアントのDispatcher
の- getQueuedCallCount() および getRunningCallCount() でさえ、cancel()を呼び出した後に0を返します。
これが機能するために私がしなければならないことは他にありますか?それとも、OkHttpのバグでしょうか?
回避策として、クライアントのExecutorService
でshutdownNow()
を呼び出していますが、よりクリーンなソリューションをお勧めします。
PDATE:これは、cancelAll()
メソッドを持つDispatcher
を使用することにより、OkHttp3ではるかに簡単に実現できるようになりました。ディスパッチャはOkHttpClient.dispatcher()
から返されます。
古い解決策:これを行う唯一の方法(私が見つけた)は、OkHttpClient
のサブクラスを作成し、それをRetrofitで使用することです。
class OkHttpClientExt extends OkHttpClient {
static final Object TAG_CALL = new Object();
@Override
public Call newCall(Request request) {
Request.Builder requestBuilder = request.newBuilder();
requestBuilder.tag(TAG_CALL);
return super.newCall(requestBuilder.build());
}
}
次の行は、タグTAG_CALL
を持つすべてのリクエストをキャンセルします。上記のクラスはすべてのリクエストにTAG_CALL
を設定しているため、すべてのリクエストがキャンセルされます。
retrofit.client().cancel(OkHttpClientExt.TAG_CALL);