2014-10-12 70 views
6

我正在使用Android Volley緩存請求,這個工作正常,當我使用GET時,但由於某些原因我切換到使用POST。現在我想用不同的POST數據緩存相同的URL。Android排球緩存與不同的POST請求

  • 請求1 - > URL1,POST數據= 「貓= 1」
  • 請求2 - > URL1,POST數據= 「貓= 2」
  • 請求3 - > URL1,POST數據=「貓= 3"

被這可以與Android凌空

回答

12

Volley.Request.getCacheKey()回報這在我的情況是相同的URL來完成;這對我不起作用。

相反,我曾在我的子類覆蓋getCacheKey()返回URL + POST(鍵=值)

這樣,我就能夠緩存所有以不同的POST數據的相同URL所做的POST請求。

當您嘗試檢索緩存的請求時,需要使用相同的方法構建緩存鍵。

所以這裏是我的代碼的快照:

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

當你永遠構建你可以使用getCacheKey一個新的請求()首先把它在請求隊列之前搜索緩存請求。

我希望這會有所幫助。

+0

你在哪裏初始化mParams對象?請幫幫我! – 2015-10-19 11:41:24

+1

謝謝,你救了我的命。 – 2015-10-19 12:09:26

+0

您節省了我的時間 – 2016-02-26 04:48:26

2

此外,如果你不想使用現有Request類之一,你可以按照這個代碼(我用JsonArrayRequest在這裏,你可以使用任何你想要的)

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

基於Mahmoud Fayez's answer,這裏的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; 
}