Retrofit + Okhttp取消操作不起作用

我在我的应用程序中使用这种改造

final OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.interceptors().add(new YourInterceptor()); final OkClient okClient = new OkClient(okHttpClient); Builder restAdapterBuilder = new RestAdapter.Builder(); restAdapterBuilder.setClient(okClient).setLogLevel(LogLevel.FULL) .setEndpoint("some url"); final RestAdapter restAdapter = restAdapterBuilder.build(); public class YourInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { // TODO Auto-generated method stub Request request = chain.request(); if (request != null) { Request.Builder signedRequestBuilder = request.newBuilder(); signedRequestBuilder.tag("taggiventorequest"); request = signedRequestBuilder.build(); request.tag(); } return chain.proceed(request); } } 

发送请求后,我打电话

 okHttpClient.cancel("taggiventorequest"); 

但要求不取消我收到改造的回应不知道为什么它不取消我的要求

我需要像取消改造一样凌空抽射

Solutions Collecting From Web of "Retrofit + Okhttp取消操作不起作用"

作为改进API规范 ,取消请求将包含在2.0版本中。

在收到响应后,cancel()是一个空操作。 在所有其他情况下,该方法将设置任何callback为空(从而释放对匿名声明的封闭类的强引用)并呈现请求对象。 所有未来与请求对象的交互都将引发exception。 如果请求在执行程序中等待,它的未来将被取消,从而永远不会被调用。

现在,您可以通过创build自定义的callback类来实现callback。

 public abstract class CancelableCallback<T> implements Callback<T> { private boolean canceled; private T pendingT; private Response pendingResponse; private RetrofitError pendingError; public CancelableCallback() { this.canceled = false; } public void cancel(boolean remove) { canceled = true; } @Override public void success(T t, Response response) { if (canceled) { return; } onSuccess(t, response); } @Override public void failure(RetrofitError error) { if (canceled) { return; } onFailure(error); } protected abstract void onSuccess(T t, Response response); protected abstract void onFailure(RetrofitError error); } 

MyApi.java,

 private interface MyApi { @GET("/") void getStringList(Callback<List<String>> callback); } 

在活动或片段中,

 RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(Config.URL) .build(); MyApi service = restAdapter.create(MyApi.class); CancelableCallback callback = new CancelableCallback<List<String>>() { @Override protected void onSuccess(List<String> stringList, Response response) { for (String str : stringList) { Log.i("Result : ", str); } } @Override protected void onFailure(RetrofitError error) { Log.e("Error : ", error.getMessage() + ""); } }; service.getStringList(callback); 

要取消你的请求,简单的调用

 callback.cancel(); 

这是取消每个请求的简单示例。 您可以通过创buildcallbackpipe理器类同时处理(取消,暂停,恢复)两个或多个请求。 请看看该评论以供参考。

希望它对你有用。

问题是请求已经完成,从文档:

http://square.github.io/okhttp/javadoc/com/squareup/okhttp/OkHttpClient.html#cancel-java.lang.Object-

 cancel 

公共OkHttpClient取消(对象标签)

取消所有使用标签标记的预定或正在进行的呼叫。 已经完成的请求不能被取消。