Отменить все запросы залпа Android

На данный момент яиспользуя mRequestQueue.cancelAll (getActivity ()) при включенном методе во фрагменте, но, по-видимому, когда я перемещаю телефон из альбомной ориентации в портретную, он по-прежнему возвращает данные, сделанные в запросе, но вызывает сбой, поскольку держатели для данных больше не существуют , любой пример кода, как это сделать правильно?

 Sandro15 июл. 2013 г., 17:25
Вы проверяли активность тура?изменить? Я верил, что активность разрушается, а затем восстанавливается при вращении. А так как Activity, похоже, ваш тэг,больше не один и тот же тег.

Ответы на вопрос(9)

Единственный способ, которым предоставленный вами код будет работать. Метод cancelAll ищет все запросы с тегом любого предоставленного вами тега и отменяет их.

Проверьте эту статью. Он использует Oto в качестве одноэлементной шины событий. Таким образом, вы можете уведомить очередь залпа, когда ваша активность или фрагменты будут воссозданы. Вы, конечно, можете использовать простой старый интерфейс и слушать изменения. Но Отто выглядит гораздо менее многословно и элегантно, как единое решение.

http://andraskindler.com/blog/2013/eventbus-in-android-an-otto-example/

Если вы добавляете запрос в очередь из фрагмента, вы должны отменить его следующим образом:mRequestQueue.cancelAll(this) , И извините, если нене работает - я непроверить это решение. Но я надеюсь, что это поможет вам.

 Bala Vishnu10 июн. 2014 г., 13:54
это работает, только если вы установили тег для всех запросов :( у меня не сработало

Я знаю, что этот ответ приходит поздно, но на случай, если у кого-то еще возникнет эта проблема:

В моей реализации тег был установлен (и перезаписан) в точке, где запрос был добавлен в очередь.

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

Регистрация запущенных запросов и распечатка тегов привели меня к решению:

mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
    @Override
        public boolean apply(Request request) {
        Log.d("DEBUG","request running: "+request.getTag().toString());
            return true;
        }
});

мы долго боролись с утечкой памяти, пока не обнаружили, что вызвали stop () из класса 'RequestQueue.

//Initialize the object
RequestQueue requestQueue = 
        Volley.newRequestQueue(getActivity().getApplicationContext());

//Release the object
requestQueue.stop();
requestQueue = null;

Класс говорит этоОстанавливает кеш и сетевые диспетчеры. " Что бы это ни значило ...

Вместо использования тега для cancelAll создайте универсальный RequestFilter.

mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
    @Override
        public boolean apply(Request request) {
            return true;
        }
    });

РЕДАКТИРОВАТЬ: Это отменяет все запросы от всех действий / фрагментов, и неработать благоприятно с жизненным циклом деятельности. Лучший способ сделать это - добавить тег String, уникальный для вашего фрагмента.

 Poutrathor04 окт. 2013 г., 10:01
Это умное решение! Это хорошо работает для меня.
 Bala Vishnu10 июн. 2014 г., 13:53
Хорошее решение. работает для меня
 rmtheis14 окт. 2017 г., 22:36
В Котлине:mRequestQueue?.cancelAll({ true })
 zarsky02 дек. 2018 г., 22:56
requestQueue?.cancelAll { true } больше Kotln;)

Вы должны установить тег на объект, а не метод.

Установив тег наgetActivity()вы просите Волли использовать динамический вызов метода в основном потоке в качестве ссылки на запрос, который происходит в фоновом потоке.

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

Вместо того, чтобы использоватьgetActivity()использоватьthis или какой-то другой объект или строку.

Это хорошая практика для любого тега, и вы также должны остерегатьсяутечка вашей активности.

Решения:

Вы можете использовать текущий объект:

request.setTag(this);

или статический объект класса

request.setTag(MyFragment.class);

или, как константа в отдельном классе:

request.setTag(CustomTags.LIST_REQUESTS);

CustomTags.LIST_REQUESTS - лучший на мой взгляд (меньше шансов утечки активности)

Что-то вроде этого:

public class CustomTags
{
    public static final String LIST_REQUESTS="CustomTags:LIST_REQUESTS";
}

Обновить

Я только что заметил, что сделал ошибку в маркировке своих запросов в Volley (хотя решения, которые я разместил выше, в порядке).

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

Таким образом, важно иметь в виду, что тег, который является просто одним и тем же строковым значением, а не одним и тем же объектом, не будет распознаваться как один и тот же.tag

Это'похоже на разницу между

String a1 = "A";
String a2 = "A";
a1 == a2;  //evaluates to false

String a1 = "A";
String a2 = "A";
a1.equals(a2); // evaluates to true
 Arst25 авг. 2014 г., 15:29
Я хотел бы поблагодарить вас за указание на концепцию сравнения строк, о которой я должен знать. Я застрял в проблеме, которую, как мне казалось, я вызвал RequestQueue.cancelAll (конечный тег объекта), чтобы отменить все мои запросы, помеченные с помощью Activity.toString (), но не 'т работа. Сравнение тегов в методе cancelAll (окончательный тег Object) фактически использует тег request.getTag () == в качестве RequestFilter, который я не сделалзаметить Теперь написал request.getTag (). Equal (tag), так как RequestFilter исправил мою проблему.
 Silvia H12 авг. 2015 г., 13:29
@pjco не долженt setTag () вызываться по самому запросу, а не по очереди?
 pjco13 авг. 2015 г., 02:37
Да, я думаю, что вы правы, я обновлю ответ. Мои имена переменных подразумевают, что это сигнал, а не то, что вы помечаете.
 pjco17 авг. 2015 г., 16:39
Ответ @SilviaHisham обновлен, спасибо, что заметили это!

вить тег для каждого из ваших запросов, он может никогда не сработать. Насколько я вижу, Volley НЕ устанавливает тег для ваших запросов

 EkKoZ14 июн. 2013 г., 16:17
я установил тег как mRequestQueue.setTag (getActivity ()); , но это не сработало.
 Zh. Atanasov14 июн. 2013 г., 17:02
У меня нетЯ сам использовал эту функциональность, но я думаю, что вы должны поместить тег в ваш объект Request, а не в Queue.

В случае фрагмента; Используйте только одинRequestQueue rQueue; Инициализируйте это вOnCreate method; И использовать его для всех запросов залпа; и в конце

@OverrideI»

public void onStop () {

    super.onStop();
    if (rQueue != null) {
        rQueue.cancelAll(this);
    }
}

Ваш ответ на вопрос