Retrofit + Okhttp取消操作无效

15

我正在使用retrofit在我的应用程序中,就像这样:

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

但请求未被取消,我仍然从Retrofit获得响应,不知道为什么它没有取消我的请求。

我需要像Volley一样取消Retrofit的请求。


你确定在调用取消之前,你的请求没有完成吗? - Nikola Despotoski
当然,我在点击取消后的2秒内收到了响应。 - SHASHIDHAR MANCHUKONDA
@NikolaDespotoski,我可以期待什么时候发布Retrofit 2.0版本? - SHASHIDHAR MANCHUKONDA
2个回答

6

根据Retrofit API规范,取消请求将包含在2.0版本中。

在接收到响应后,cancel()无效。在所有其他情况下,该方法将设置任何回调为null(如果匿名声明,则释放对包含类的强引用),并使请求对象失效。与请求对象的所有未来交互都将抛出异常。如果请求在执行器中等待,则其Future将被取消,以便永远不会被调用。

目前,您可以通过创建实现retrofit上的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);
}

在Activity或Fragment中,
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();

这是一个简单的示例,用于取消每个请求。您可以通过创建回调管理器类来处理(取消、暂停、恢复)同时进行的两个或多个请求。请参考该评论。希望对您有所帮助。

感谢您的解释,但在这种情况下,当取消命中时,您只是忽略了响应。因此,执行程序仍在后台运行。 - raditya gumay

3

3
请求没有被取消,仍未发送响应。 我在点击取消按钮后收到了响应。 - SHASHIDHAR MANCHUKONDA
OkHttp请求未取消我的正在进行的调用。 - Faraz Ahmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接