2014-10-12 16 views
6

Ich benutze Android Volley zu Cache-Anfragen dies funktioniert gut, wenn ich GET verwendet habe, aber ich habe aus einigen Gründen POST zu verwenden. Jetzt möchte ich die gleiche URL mit verschiedenen POST-Daten zwischenspeichern.Android Volley Caching mit verschiedenen POST-Anfragen

  • Anfrage 1 -> URL1, POST Data = "Cat = 1"
  • anfordern 2 -> URL1, POST Data = "Cat = 2"
  • Anfrage 3 -> URL1, POST Data = " cat = 3"

wird dies mit Android Volley

Antwort

12

wie die Volley.Request.getCacheKey() kehrt die URL, die in meinem Fall geschehen ist die gleiche; das hat bei mir nicht funktioniert.

Stattdessen hatte ich getCacheKey() in meinem Kind Klasse außer Kraft zu setzen URL + POST (key = Value)

Auf diese Weise konnte ich Cache all POST Anfragen an die gleiche URL mit unterschiedlichen POST-Daten zurück .

Wenn Sie versuchen, die zwischengespeicherte Anforderung abzurufen, müssen Sie den Cache-Schlüssel auf die gleiche Weise erstellen.

so hier ist eine Momentaufnahme meines Codes:

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; 
    } 
} 

Wann immer Sie eine neue Anforderung konstruieren Sie getCacheKey verwenden können() für die im Cache gespeicherten Anforderung zuerst zu suchen, bevor es in den Anfragen Warteschlange stellen.

Ich hoffe, das hilft.

+0

Wo initialisierst du das mParams-Objekt? Bitte hilf mir! –

+1

Danke, Du hast mir das Leben gerettet. –

+0

Sie haben meine Zeit gespeichert –

2

Auch wenn Sie nicht wollen, eine der vorhandenen Request Klassen verwenden Sie diesen Code folgen kann (ich verwende JsonArrayRequest hier, können Sie, was Sie wollen)

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); 
    } 
}; 

und basierend auf Mahmoud Fayez's answer, hier die generateCacheKeyWithParam() Methode:

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; 
}