Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 改装+;Okhttp取消操作不工作_Android_Httprequest_Retrofit_Okhttp_Cancellation - Fatal编程技术网

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