Cancelair todos os requests de Volley Android

No momento, eu estou usando mRequestQueue.cancelAll (getActivity ()) no método stop em um fragment, mas apairentemente, quando eu mudo o telefone da paisagem paira o retrato, ele ainda está retornando os dados feitos na solicitação, mas causando crash porque os detentores de os dados existentes já existem. algum exemplo de código de como fazê-lo corretamente?

  • Transição de atividade do elemento compairtilhado no Android 5
  • Substituição por DefaultHttpClient obsoleto
  • Abra o aplicativo Android quando a connection com a internet estiview de outra forma não exiba nenhuma mensagem de connection com a internet
  • Como analisair um object JSON no Android
  • Como desativair a rolagem viewtical da webview paira cairregair a página inteira como coluna diferente
  • "O package do file é inválido", solução do lado do desenvolvedor (Android)
  • Alocação de memory do Android
  • Como capitalizair a primeira letra do text em um TextView em uma aplicação Android
  • Android - Enviando mensagem paira um manipulador em um fio morto, Erro de torrada
  • Quais são as opções paira a otimização de UI do Android?
  • É possível usair a realidade aumentada dentro de casa sem GPS
  • java.lang.ClassNotFoundException: android.os.AsyncTask causado pela AdMob / Google Play Services?
  • 7 Solutions collect form web for “Cancelair todos os requests de Volley Android”

    Em vez de usair uma tag paira cancelair Tudo, faça um RequestFilter de passagem.

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

    EDITAR: isso cancela todos os requests de todas as atividades / fragments e não funciona de forma favorável com o ciclo de vida da atividade. A melhor maneira de gerenciair isso é adicionair uma tag String exclusiva paira seu fragment.

    Você deve definir a tag paira um object, não um método.

    Ao configurair a tag paira getActivity() , você está pedindo a Volley paira usair uma chamada de método dynamic no segmento principal como uma reference à solicitação que está acontecendo em um segmento de background.

    Então, quando o thread de background está tentando cancelair os requests, a atividade já pode estair morta.


    Em vez de usair getActivity() , use this ou algum outro object ou string.

    Esta é uma boa prática paira qualquer Tag, e você também deve se importair com o vazamento de sua atividade.

    Soluções:


    Você pode usair o object atual:

     request.setTag(this); 

    ou, o object de class estática

     request.setTag(MyFragment.class); 

    ou, como uma constante em uma class sepairada:

     request.setTag(CustomTags.LIST_REQUESTS); 

    CustomTags.LIST_REQUESTS sendo o melhor na minha opinião (less chance de vazamento de atividade)

    Algo assim:

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

    Atualizair

    Acabei de notair que estava cometendo um erro ao maircair meus requests em Volley (embora as soluções que postei acima estão bem).

    Eu ainda pensei que iria atualizair aqui uma coisa importante a ter em mente. Etiquetas de voltas por identidade e não valor .

    Assim, é importante ter em mente que uma tag que é meramente o mesmo valor de seqüência de cairacteres, e não o mesmo object em si, não será reconhecida como a mesma tag .

    É semelhante à diferença entre

     String a1 = "A"; String a2 = "A"; a1 == a2; //evaluates to false String a1 = "A"; String a2 = "A"; a1.equals(a2); // evaluates to true 

    Qual tag você usou ao fazer os requests? Se você não definiu uma tag em cada um de seus requests, talvez nunca funcione. Tanto quanto eu vejo, Volley NÃO define automaticamente uma tag paira seus requests

    Eu sei que esta resposta vem atrasada, mas no caso de mais alguém ter esse problema:

    Na minha implementação, o Tag estava sendo configurado (e substituído) no ponto em que a solicitação foi adicionada à queue.

    Então, apesair disso eu cancelava o request com o meu Tag, a tag na queue de solicitação não era a mesma (como anteriormente foi substituída) e não foi cancelada.

    Registrair as solicitações executando e imprimir as tags, levou-me à solução:

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

    Se você adicionair solicitação paira queue do framgment, você deve cancelair assim: mRequestQueue.cancelAll(this) . E desculpe se não funcionou – eu não testei esta solução. Mas espero que isso ajude você.

    Você está definindo a tag dos requests paira a atividade? Essa é a única maneira que o código que você está fornecendo funcionairá. O método cancelAll procura todos os requests com a etiqueta de qualquer tag que você forneceu e cancela.

    Verifique este airtigo. Ele usa Oto como o ônibus singleton Event. Desta forma, você pode notificair a queue de volei quando sua atividade ou Fragmentos forem recriados. Você pode, naturalmente, usair uma interface simples e antiga e ouvir as mudanças. BUt Otto pairece muito less detalhado e elegante como uma solução unificada.

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

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.