2014-10-12 18 views
6

Sto usando Android Volley per memorizzare le richieste di cache funziona correttamente quando utilizzavo GET ma sono passato a utilizzare il POST per alcuni motivi. Ora voglio memorizzare nella cache lo stesso URL con diversi dati POST.Cache di Volley Android con diverse richieste POST

  • Richiesta 1 -> URL1, POST dati = "Cat = 1"
  • Richiesta 2 -> URL1, POST dati = "cat = 2"
  • Richiesta 3 -> URL1, POST dati = " cat = 3"

è questo può essere fatto con Android Volley

risposta

12

le Volley.Request.getCacheKey() restituisce l'URL che nel mio caso è la stessa; questo non ha funzionato per me.

Invece ho dovuto ignorare getCacheKey() nella mia classe figlio di tornare URL + POST (key = Value)

In questo modo sono stato in grado di memorizzare nella cache tutte le richieste POST fatte allo stesso URL con diversi dati POST .

quando si tenta di recuperare la richiesta memorizzata nella cache è necessario costruire la chiave di cache allo stesso modo.

ecco un'istantanea del mio codice:

public class CustomPostRequest extends Request<String> { 
    . 
    . 
    private Map<String, String> mParams; 
    . 
    . 
    public void SetPostParam(String strParam, String strValue) 
    { 
     mParams.put(strParam, strValue); 
    } 

    @Override 
    public Map<String, String> getParams() { 
     return mParams; 
    } 

    @Override 
    public String getCacheKey() { 
     String temp = super.getCacheKey(); 
     for (Map.Entry<String, String> entry : mParams.entrySet()) 
      temp += entry.getKey() + "=" + entry.getValue(); 
     return temp; 
    } 
} 

Quando mai si costruisce una nuova richiesta è possibile utilizzare getCacheKey() per cercare la richiesta di cache prima prima di metterlo in coda richieste.

Spero che questo aiuti.

+0

Dove inizializzi l'oggetto mParams? Mi aiuti per favore! –

+1

Grazie, mi hai salvato la vita. –

+0

hai salvato il mio tempo –

2

anche se non si desidera utilizzare uno degli attuali Request classi è possibile seguire questo codice (sto usando JsonArrayRequest qui, si può usare quello che vuoi)

Map<String, String> params = yourData; 

JsonArrayRequest request = new JsonArrayRequest(Request.Method.POST, url, 
    new Response.Listener<JSONArray>() { 
     ... Needed codes 
    }, 
    new Response.ErrorListener() { 
     ... 
    } 
){ 
    @Override 
    protected Map<String, String> getParams() throws AuthFailureError { 
     return params; 
    } 
    @Override 
    public String getCacheKey() { 
     return generateCacheKeyWithParam(super.getCacheKey(), params); 
    } 
}; 

e sulla base Mahmoud Fayez's answer, qui il metodo generateCacheKeyWithParam():

public static String generateCacheKeyWithParam(String url, Map<String, String> params) { 
    for (Map.Entry<String, String> entry : params.entrySet()) { 
     url += entry.getKey() + "=" + entry.getValue(); 
    } 
    return url; 
} 
Problemi correlati