Не завершена операция переоснащения + Okhttp cancel

Я использую модификацию в своем приложении, например

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

но запрос не отменяет, я получаю ответ от модификации не знаю, почему он не отменяет мой запрос

Мне нужен волейбол, как отмена модификации

Ответы

Ответ 1

В качестве Retrofit API Spec, запрос на отладку будет включен в версию 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);
}

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

Это простой пример для отмены каждого запроса. Вы можете обрабатывать (отменять, приостанавливать, возобновлять) два или более запроса одновременно, создавая класс менеджера обратного вызова. Пожалуйста, посмотрите этот комментарий для справки.

Надеюсь, это будет полезно для вас.