2014-10-12 18 views
6

Używam Android Volley do buforowania zapytań, które działają poprawnie, gdy korzystałem z GET, ale z jakichś powodów zmieniłem sposób korzystania z POST. Teraz chcę buforować ten sam URL z różnymi danymi POST.Buforowanie siatkówki Android z różnymi żądaniami POST

  • zgłoszeń 1 -> URL1 POST danych = "CAT = 1"
  • zgłoszeń 2 -> URL1 POST danych = "CAT = 2"
  • zgłoszeń 3 -> URL1 POST danych = " cat = 3"

jest to można zrobić z Androidem Volley

Odpowiedz

12

jak Volley.Request.getCacheKey() zwraca URL, które w moim przypadku jest taka sama; to mi nie pasowało.

Zamiast tego musiałem zastąpić getCacheKey() w klasie dzieci do powrotu URL + POST (klucz = wartość)

W ten sposób udało mi się w pamięci podręcznej wszelkie żądania POST skierowane do tego samego adresu URL z różnymi danymi POST .

przy próbie pobrania buforowanego żądania należy skonstruować klucz pamięci podręcznej w ten sam sposób.

więc o to migawka z mojego kodu:

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

Gdy kiedykolwiek skonstruować nowy wniosek można użyć getCacheKey(), aby wyszukać w pamięci podręcznej życzenie pierwszy przed wprowadzeniem go w kolejce żądań.

Mam nadzieję, że to pomoże.

+0

Gdzie inicjalizujesz obiekt mParams? Proszę pomóż mi! –

+1

Dziękuję, uratowałeś mi życie. –

+0

zaoszczędzisz mój czas –

2

Także, jeśli nie chcesz używać jednego z istniejących Request klas można śledzić ten kod (używam JsonArrayRequest tutaj, można użyć co chcesz)

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

i na podstawie Mahmoud Fayez's answer, tutaj metoda 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; 
} 
Powiązane problemy