【问题标题】:Retrofit + Okhttp cancel operation not working改造+ Okhttp取消操作不起作用
【发布时间】:2015-10-07 02:39:52
【问题描述】:

我正在像这样在我的应用程序中使用改造

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

但请求没有取消,我得到了改造的响应 不知道为什么它没有取消我的请求

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

【问题讨论】:

  • 您确定在调用取消之前您的请求尚未完成吗?
  • 是的,我在单击取消 2 秒后得到响应
  • @NikolaDespotoski 我什么时候可以期待改造 2.0 版本?

标签: android httprequest retrofit okhttp cancellation


【解决方案1】:

作为Retrofit API Spec,取消请求将包含在2.0版本中。

cancel() 在收到响应后是无操作的。在所有其他 在这种情况下,该方法会将任何回调设置为 null (从而释放强 如果匿名声明,则引用封闭类)并渲染 请求对象死了。与请求的所有未来交互 对象会抛出异常。如果请求正在等待 executor 它的 Future 将被取消,因此它永远不会被调用。

目前,您可以通过创建自定义回调类来实现,该类在 Callback from retrofit 上实现。

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

这是一个取消每个请求的简单示例。您可以通过创建回调管理器类同时处理(取消、暂停、恢复)两个或多个请求。请查看that comment 以供参考。

希望对你有用。

【讨论】:

  • 感谢您的解释,但在这种情况下,您只需忽略取消命中时的响应。所以,执行器仍然在后台运行。
【解决方案2】:

问题是请求已完成,来自文档:

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

cancel

public OkHttpClient 取消(对象标签)

取消所有带有标签的预定或飞行中的呼叫。已完成的请求无法取消。

【讨论】:

  • 请求没有取消,仍然没有发送响应我点击取消按钮后得到响应
  • OkHttp 请求未取消我正在进行的通话。
猜你喜欢
  • 2019-03-25
  • 2015-06-01
  • 2016-06-27
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 2018-12-16
  • 2021-05-30
  • 2019-12-25
相关资源
最近更新 更多