【问题标题】:Android Volley Caching with different POST requests具有不同 POST 请求的 Android Volley 缓存
【发布时间】:2014-10-12 14:20:56
【问题描述】:

我正在使用 Android Volley 缓存请求,这在我使用 GET 时工作正常,但由于某些原因我切换到使用 POST。现在我想用不同的 POST 数据缓存相同的 URL。

  • 请求 1 -> URL1,POST 数据 = "Cat=1"
  • 请求 2 -> URL1,POST 数据 = "Cat=2"
  • 请求 3 -> URL1,POST 数据 = "Cat=3"

这可以用 Android Volley 完成吗

【问题讨论】:

    标签: android-volley


    【解决方案1】:

    Volley.Request.getCacheKey() 返回的 URL 在我的情况下是相同的;这对我不起作用。

    相反,我必须在我的子类中覆盖 getCacheKey() 以返回 URL+POST(key=Value)

    这样我就可以缓存所有对同一个 URL 发出的具有不同 POST 数据的 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();// not do another request
            return temp;
        }
    }
    

    当你构造一个新的请求时,你可以使用 getCacheKey() 在将它放入请求队列之前先搜索缓存的请求。

    我希望这会有所帮助。

    【讨论】:

    • 在哪里初始化 mParams 对象?请帮帮我!
    • 我在保存缓存键时没有得到响应,请求是第一次发送但之后没有得到任何响应。
    • 检查凌空日志后,似乎请求没有添加到队列中
    【解决方案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) {
        StringBuilder urlBuilder = new StringBuilder(url);
        for (Map.Entry<String, String> entry : params.entrySet()) {
          urlBuilder.append(entry.getKey()).append("=").append(entry.getValue());
        }
        url = urlBuilder.toString();
        return url;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      相关资源
      最近更新 更多