web-dev-qa-db-ja.com

Retrofit 2 / OkHttp:実行中のすべてのリクエストをキャンセルします

OkHttp2.7.0でRetrofit2-beta2を使用しています。

RetrofitからOkHttpClientオブジェクトを取得するには、 Retrofit .client() メソッドを使用しており、実行中のすべてのリクエストをキャンセルするには、 cancel(Object tag) メソッドですが、リクエストは引き続き実行され、応答が返されます。

クライアントのDispatcherの-​​ getQueuedCallCount() および getRunningCallCount() でさえ、cancel()を呼び出した後に0を返します。

これが機能するために私がしなければならないことは他にありますか?それとも、OkHttpのバグでしょうか?

回避策として、クライアントのExecutorServiceshutdownNow()を呼び出していますが、よりクリーンなソリューションをお勧めします。

11

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);
22