Android 改装+;Okhttp取消操作不工作
我在我的应用程序中使用这样的改型Android 改装+;Okhttp取消操作不工作,android,httprequest,retrofit,okhttp,cancellation,Android,Httprequest,Retrofit,Okhttp,Cancellation,我在我的应用程序中使用这样的改型 final OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.interceptors().add(new YourInterceptor()); final OkClient okClient = new OkClient(okHttpClient); Builder restAdapterBuilder = new RestAdapt
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");
但请求并没有取消,我从改装中得到了响应
不知道为什么它不取消我的请求
我需要截击式的取消改装问题是,请求已从文档中完成: 公共OkHttpClient取消(对象标记) 取消所有带有标签的计划或飞行中呼叫。无法取消已完成的请求 如前所述,取消请求将包含在版本2.0中 cancel()是接收到响应后的no op。在所有其他方面 在某些情况下,该方法会将任何回调设置为null(从而释放强回调) 对封闭类的引用(如果匿名声明)和呈现 请求对象已死亡。所有未来与请求的交互 对象将引发异常。如果请求正在中等待 执行器的未来将被取消,因此它永远不会被调用 现在,您可以通过创建自定义回调类来实现这一点,该类在改型回调时实现
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);
}
这是一个取消每个请求的简单示例。通过创建回调管理器类,可以同时处理(取消、暂停、恢复)两个或多个请求。请看一下以供参考
希望它对您有用。请求没有取消,但仍然没有发送响应我在单击“取消”按钮后收到响应Nokhttp请求没有取消我正在进行的呼叫。您确定您的请求没有在呼叫“取消”之前完成吗?是的,确定我在单击2秒钟后收到响应cancel@NikolaDespotoski 我什么时候可以期望改型2.0版本?感谢您的解释,但是在这种情况下,当取消按钮点击时,您只需忽略响应。所以,执行器仍在后台运行。
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);
}
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();