解析 Android HttpResponse 缓存更新?

Posted

技术标签:

【中文标题】解析 Android HttpResponse 缓存更新?【英文标题】:parsing Android HttpResponse cache update? 【发布时间】:2014-02-20 23:29:16 【问题描述】:

我实际上是在尝试在我的 android.so 中启用 HttpResponse 缓存,所以我通过调用此方法在 onCreate 方法的主要活动中启用了我的缓存:

  private void enableHttpCaching()
   
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
      
        try 
          File httpCacheDir = new File(getApplicationContext().getCacheDir()
                  , "http");
          long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
          HttpResponseCache.install(httpCacheDir, httpCacheSize);
         catch (IOException e) 
            e.printStackTrace();

                
    
    else
    
        File httpCacheDir = new File(getApplicationContext().getCacheDir()
                , "http");
        try 
            com.integralblue.httpresponsecache.HttpResponseCache.install
                (httpCacheDir, 10 * 1024 * 1024);
         catch (IOException e)        
            e.printStackTrace(); 
                    
    
   

但是如果服务器数据被修改,我希望我的缓存更新我在官方 developer.android 中找到了这部分代码

  long currentTime = System.currentTimeMillis());

  HttpURLConnection conn = (HttpURLConnection) url.openConnection();

  long expires = conn.getHeaderFieldDate("Expires", currentTime);
  long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime);

  setDataExpirationDate(expires);

 if (lastModified < lastUpdateTime) 
    // Skip update
  else 
  // Parse update
 

我的问题是如何跳过更新? 我的意思是如何从缓存中获取数据?

这是我的 getJson 方法

   public String getJSON(String url, int timeout) 
    try 
        URL u = new URL(url);
        HttpURLConnection c = (HttpURLConnection) u.openConnection();
        c.setRequestMethod("GET");
        c.setRequestProperty("Content-length", "0");
        int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
        c.addRequestProperty("Cache-Control", "max-stale=" + maxStale);
        c.setUseCaches(true);
        c.setAllowUserInteraction(false);
        c.setConnectTimeout(timeout);
        c.setReadTimeout(timeout);
        c.connect();
        int status = c.getResponseCode();

        switch (status) 
            case 200:
            case 201:
                BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = br.readLine()) != null) 
                   // sb.append(line+"\n");
                     sb.append(line);
                
                br.close();
                return sb.toString();
        

     catch (MalformedURLException ex) 
        ex.printStackTrace();
        //Logger.getLogger(DebugServer.class.getName()).log(Level.SEVERE, null, ex);
     catch (IOException ex) 
        ex.printStackTrace();
        //Logger.getLogger(DebugServer.class.getName()).log(Level.SEVERE, null, ex);
    
    return null;

如您所见,如果服务器数据更新,我可能会获得陈旧数据。我想对其进行优化以测试 http 响应标头以检查更新

【问题讨论】:

【参考方案1】:

你使用什么协议? JSON、XML 还是其他?您需要从 HttpURLConnection (http://docs.oracle.com/javase/tutorial/networking/urls/readingWriting.html) 解析 InputStream

顺便说一句,我建议你这个库:

    对于 JSON — Gson (http://code.google.com/p/google-gson/)。 对于 XML — SimpleXML (http://simple.sourceforge.net/)。

也可能有帮助:

——Read/convert an InputStream to a String

【讨论】:

我做错了我正在搜索的是跳过更新吗?我的意思是如何从缓存中获取数据? 您使用 HttpResponseCache,因此您可以在此处阅读如何检索数据:developer.android.com/reference/android/net/http/…。另外你不需要直接获取数据,如果数据缓存,它会自动检索,还有关于这个的文章:practicaldroid.blogspot.ru/2013/01/… 您也可以在这里查看我的答案。它可能会帮助你。 ***.com/questions/29517298/…

以上是关于解析 Android HttpResponse 缓存更新?的主要内容,如果未能解决你的问题,请参考以下文章

彻底解析Android缓存机制——LruCache

Android 已弃用 apache 模块(HttpClient、HttpResponse 等)

PC 上的 Android 与 Java:不同的 HttpResponse?

Android HttpResponse响应代码[重复]

为 Android 创建 HttpResponse 超时 [重复]

Android从 HttpResponse (或者InputStream) 获取字符串内容的代码