2014-10-12 21 views
6

Tôi đang sử dụng Android Volley để yêu cầu bộ nhớ cache hoạt động tốt khi tôi sử dụng GET nhưng tôi đã chuyển sang sử dụng POST vì một số lý do. Bây giờ tôi muốn cache cùng một URL với dữ liệu POST khác nhau.Android Volley Caching với các yêu cầu POST khác nhau

  • Yêu cầu 1 -> URL1, POST dữ liệu = "Cát = 1"
  • Yêu cầu 2 -> URL1, POST dữ liệu = "Cát = 2"
  • Yêu cầu 3 -> URL1, POST dữ liệu = " cat = 3"

được điều này có thể được thực hiện với Android Volley

Trả lời

12

như Volley.Request.getCacheKey() lợi nhuận URL mà trong trường hợp của tôi là như nhau; điều này không hiệu quả với tôi.

Thay vào đó tôi phải ghi đè getCacheKey() trong lớp con tôi quay trở lại URL + POST (key = Value)

Bằng cách đó tôi đã có thể bộ nhớ cache tất cả các yêu cầu POST thực hiện cho các URL tương tự với dữ liệu POST khác nhau .

khi bạn cố truy xuất yêu cầu được lưu trong bộ nhớ cache, bạn cần tạo khóa bộ nhớ cache theo cùng một cách.

vì vậy đây là một bản chụp của mã của tôi:

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

Khi bao giờ bạn xây dựng một yêu cầu mới, bạn có thể sử dụng getCacheKey() để tìm kiếm các yêu cầu lưu trữ đầu tiên trước khi đưa nó vào hàng đợi yêu cầu.

Tôi hy vọng điều này sẽ hữu ích.

+0

Bạn khởi tạo đối tượng mParams ở đâu? Làm ơn giúp tôi! –

+1

Cảm ơn bạn, Bạn đã cứu mạng tôi. –

+0

bạn đã lưu thời gian của tôi –

2

Ngoài ra nếu bạn không muốn sử dụng một trong những Request lớp hiện tại bạn có thể làm theo mã này (Tôi đang sử dụng JsonArrayRequest đây, bạn có thể sử dụng bất cứ điều gì bạn muốn)

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

và dựa trên Mahmoud Fayez's answer, ở đây generateCacheKeyWithParam() phương pháp:

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