Адмяніць усе Volley просіць Android

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

20
Праверылі Ці вы гастрольную дзейнасць не змяніліся? Я верыў, актыўнасць руйнуецца, а затым аднавіць пры кручэнні. І, як актыўнасць, здаецца, тэг, гэта не той жа тэг больш.
дададзена аўтар Sandro, крыніца

8 адказы

Замест таго, каб выкарыстоўваць тэг для cancelAll, зрабіць усё-пас RequestFilter.

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

EDIT: Гэта адмяняе ўсе запыты ад усіх відаў дзейнасці/фрагментаў, і не працуе спрыяльна з жыццёвым цыклам дзейнасці. Лепшы спосаб справіцца з гэтым, каб дадаць радок тэга унікальны для вашага фрагмента.

56
дададзена
Гэта разумнае рашэнне! Яна працуе добра для мяне.
дададзена аўтар Poutrathor, крыніца
У Котлін: mRequestQueue .cancelAll ({дакладна})
дададзена аўтар rmtheis, крыніца
добрае рашэнне. працуе для мяне
дададзена аўтар Bala Vishnu, крыніца

You should set the tag to an object, not a method.

Усталяваўшы тэг getActivity() , вы просіце Volley выкарыстоўваць дынамічны выклік метаду ў асноўным патоку ў якасці спасылкі на запыт, які адбываецца на фоне патоку.

Таму, калі фонавы паток спрабуе адмяніць запыты, дзейнасць можа быць ужо мёртвая.


Замест таго каб выкарыстоўваць getActivity() , выкарыстоўвайце гэта ці якой-небудзь іншы аб'ект або радок.

This is good practice for any Tag, and you should also beware of leaking your activity.

Рашэнні:


Вы можаце выкарыстоўваць бягучы аб'ект:

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 (хоць рашэнне я размясціў вышэй штраф).

Я да гэтага часу думаў, што абнаўленне тут важная рэч, каб мець на ўвазе. Volley тэгі па тоеснасці не значэнне .

Такім чынам, важна мець на ўвазе, што тэг, які з'яўляецца толькі тое ж значэнне радкі, а не сам па сабе той жа аб'ект, не будзе прызнаны той жа тэг .

Гэта падобна на розніцу паміж

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

String a1 = "A";
String a2 = "A";
a1.equals(a2);//evaluates to true
17
дададзена
@pjco не павінны SetTag() быць выкліканы сам запыт, а не на чарзе?
дададзена аўтар Silvia H, крыніца
Так, я думаю, вы маеце рацыю, я буду абнаўляць адказ. Мае імёны зменных азначаюць гэта сігнал, які не тое, што вы маркіраваць.
дададзена аўтар pjco, крыніца
@SilviaHisham Адказ абнаўляецца, дзякуй за заўважыўшы, што!
дададзена аўтар pjco, крыніца
Я хацеў бы падзякаваць Вас за ўказанне на радок параўнаць канцэпцыю, якую я павінен быць у курсе. Я затрымаўся ў задачы, што я верыў, я назваў RequestQueue.cancelAll (канчатковы тэг Object), каб адмяніць усе мае запыты, пазначаныя Activity.toString (), але не працуе. Параўнанне тэгаў у cancelAll метад (канчатковы тэг Object) на самой справе выкарыстоўвае request.getTag() == тэг як RequestFilter які я не заўважыў. Цяпер напісаў request.getTag (). Роўны (тэг), як RequestFilter фіксаваная мая праблема.
дададзена аўтар Arst, крыніца

Я ведаю, што гэты адказ прыходзіць позна, але ў выпадку, калі хто-небудзь іншы з гэтай праблемай:

У маёй рэалізацыі тэгі ў цяперашні час ўстаноўлены (і перапішуцца) у пункце, дзе запыт быў дададзены ў чаргу.

Таму нягледзячы на ​​тое што я быў адмяніць запыт з маім Tag, пазнака чарзе запытаў не была такім жа (як гэта было раней перапісана), і ён не быў адменены.

Журналяванне запытаў працуюць і раздрукоўвання тэгаў, прывёў мяне да вырашэння:

mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
    @Override
        public boolean apply(Request<?> request) {
        Log.d("DEBUG","request running: "+request.getTag().toString());
            return true;
        }
});
4
дададзена

Які тэг вы выкарыстоўвалі пры стварэнні запытаў? Калі вы не ўсталявалі пазнакі на кожным з вашых запытаў яна ніколі не можа працаваць. Наколькі я бачу, Volley аўтаматычна не ўстанаўлівае тэг для вашых запытаў

3
дададзена
Я не выкарыстоўваў гэтую функцыянальнасць сам, але я думаю, што вы павінны змясціць тэг на аб'екце запыту, а не ў чарзе.
дададзена аўтар Zh. Atanasov, крыніца
я выставіцца тэг, як mRequestQueue.setTag (getActivity ()); , Але яно не спрацавала.
дададзена аўтар EkKoZ, крыніца

Наладжваеце вы тэг запытаў да дзейнасці? Гэта адзіны спосаб, код, які вы дае будзе працаваць. Метад cancelAll шукае ўсе запыты з тэгам любы тэгу вы падалі і анулюе іх.

0
дададзена

Калі дадаць запыт у чаргу з framgment, вы павінны адмяніць, як гэта: mRequestQueue.cancelAll (гэта) . І шкада, калі гэта не спрацавала - я не правяраў гэта рашэнне. Але я спадзяюся, што гэта дапаможа Вам.

0
дададзена
гэта працуе толькі калі вы ўсталявалі тэг для ўсіх запытаў :( не працавала для мяне
дададзена аўтар Bala Vishnu, крыніца

У выпадку фрагмента; Выкарыстоўвайце толькі адзін <�Код> RequestQueue rQueue; Ініцыялізаваць яго ў OnCreate метад; І выкарыстоўваць яго для запыту ўсе залпу; і ў канцы

@Override

public void onStop() {

    super.onStop();
    if (rQueue != null) {
        rQueue.cancelAll(this);
    }
}
0
дададзена

Праверце гэты артыкул. Ён выкарыстоўвае Oto як одноплодной шына падзей. Такім чынам, вы можаце паведаміць чаргу залпу, калі ваша актыўнасць або фрагменты атрымаць нанова. Вядома, Вы можаце выкарыстоўваць звычайны стары інтэрфейс, а і слухаць пра змены. Ота выглядае АЛЕ значна менш шматслоўным і элегантна, як адзінае рашэнне.

http://andraskindler.com/blog/2013/eventbus- в-андроіда-ан-Ота-прыклад/

0
дададзена