OkHttpClient не может отменить вызов по тегу

Недавно я обновился до OkHttp3 и заметил, что вы больше не можете отменить вызов по тегу непосредственно из клиента. . Теперь это должно обрабатываться приложением.

Указано в CHANGELOG здесь:

За отмену пакетов вызовов теперь отвечает приложение. API для отмены вызовов по тегу был удален и заменен более общим механизмом. Диспетчер теперь предоставляет все текущие вызовы с помощью своих методов runningCalls() и queuedCalls(). Вы можете написать код, который выбирает вызовы по тегу, хосту или чему-то еще и вызывает Call.cancel() для тех, которые больше не нужны.

Я сам отвечаю на этот пост с помощью моего простого служебного метода для отмены текущего вызова или вызова в очереди по тегу.


person Ryan R    schedule 12.03.2016    source источник


Ответы (1)


Используйте следующий служебный класс для отмены запущенного или поставленного в очередь Call по тегу:

public class OkHttpUtils {
    public static void cancelCallWithTag(OkHttpClient client, String tag) {
        // A call may transition from queue -> running. Remove queued Calls first.
        for(Call call : client.dispatcher().queuedCalls()) {
            if(call.request().tag().equals(tag))
                call.cancel();
        }            
        for(Call call : client.dispatcher().runningCalls()) {
            if(call.request().tag().equals(tag))
                call.cancel();
        }
    }
}

Я создал пример с тестовым примером здесь: https://gist.github.com/RyanRamchandar/64c5863838940ec67f03< /а>

person Ryan R    schedule 12.03.2016
comment
этот поток безопасен? есть ли вероятность того, что вызов переключается между списками, пока вы отменяете вызовы? - person njzk2; 14.03.2016
comment
Неплохо подмечено. Возможно, было бы лучше добавлять как текущие, так и поставленные в очередь вызовы в один список и отменять их с помощью одного цикла. Сначала я этого не делал из-за снижения производительности. - person Ryan R; 14.03.2016
comment
Теперь, когда вы поменяли порядок петель, для меня это имеет больше смысла. - person njzk2; 15.03.2016
comment
Да, Call может перейти из очереди в режим выполнения, поэтому сначала имеет смысл отменить список из очереди. - person Ryan R; 15.03.2016
comment
Как установить тег на вызов в первую очередь? Спасибо! - person Aneem; 02.06.2016
comment
если вызов отменен в queuedCalls (путем проверки Call.isCanceled() после call.cancel()), то нам не нужно проходить через runningCalls. А также хорошо добавить оператор break внутри цикла if. - person jettimadhuChowdary; 16.10.2018
comment
@jettimadhuChowdary нет, поскольку цель состоит в том, чтобы отменить все вызовы в очереди / выполняющиеся, соответствующие тегу. - person Ryan R; 16.10.2018
comment
@RyanR, если у нас есть один и тот же тег для нескольких запросов, мы можем использовать одно и то же решение. Но если у нас есть уникальные теги, вы можете рассмотреть мое заявление, - person jettimadhuChowdary; 18.10.2018