2015-11-09 116 views
2

時返回null,我試圖讓Volley利用其Cache工作。當我收到304getCacheEntry().datanull即使"cache-control"已設置。下面是我在做什麼:凌空緩存接收304

  1. Volley被實例化,喜歡這個

    // Instantiate the cache 
    Cache cache = new DiskBasedCache(c.getCacheDir(), 10 * 1024 * 1024); // 10 MB cap 
    
    // Set up the network to use HttpURLConnection as the HTTP client. 
    Network network = new BasicNetwork(new HurlStack()); 
    
    // Instantiate the RequestQueue with the cache and network. 
    mRequestQueue = new RequestQueue(cache, network); 
    
    // Start the queue 
    mRequestQueue.start(); 
    
  2. 發送一個GET請求後,我得到"cache-control"設置爲"max-age=180, public"響應200。到目前爲止這麼好嗎?

  3. 如果獲得GET請求兩次或更多,我設置了"If-Modified-Since"以及最後一次請求標頭的時間戳。
  4. 我第二次請求特定的API端點時,服務器將以304響應。 getCacheEntry().data返回null雖然。如果我檢查cache entriesVolleysRequestQueue我無法找到我的具體請求條目。

我在做什麼錯?出於某種原因,我有一個請求在啓動時總是被緩存。它甚至可以返回大量數據。但所有其他請求都沒有被緩存。以下代碼段解析響應並檢查304

@Override 
protected Response<T> parseNetworkResponse(NetworkResponse response, String charset) { 
    try { 
     String json = ""; 
     if (!response.notModified) { 
      json = new String(response.data, charset); 
     } else { 
      //if not modified -> strangely getCacheEntry().data always null 
      json = new String(getCacheEntry().data, charset); 
     } 
     return Response.success(
       gson.fromJson(json, clazz), 
       HttpHeaderParser.parseCacheHeaders(response)); 

    } catch (UnsupportedEncodingException e) { 
     return Response.error(new ParseError(e)); 
    } catch (JsonSyntaxException e) { 
     return Response.error(new ParseError(e)); 
    } 
} 

我真的很感激任何意見。

+0

如果您的請求是POST請求,IMO您可以閱讀以下內容http://stackoverflow.com/questions/21953519/volley-exception-error-when-response-code-304-and-200 – BNK

+0

Thanks @BNK這是一個GET請求,雖然 – Ben

+0

如果服務器在互聯網上發佈,請發佈的URL,以便我可以檢查明天 – BNK

回答

0

恕我直言,(獲得304 RESP代碼不僅當),因爲你的緩存條目總是空如下:

Cache cache = new DiskBasedCache(c.getCacheDir(), 10 * 1024 * 1024); // 10 MB cap 

請檢查您c.getCacheDir()看到,如果你想使用外部存儲器來存儲緩存數據,那麼你應該在AndroidManifest.xml文件裏設置WRITE_EXTERNAL_STORAGE權限。

希望這會有所幫助!

+0

我解決了這個問題! 'WRITE_EXTERNAL_STORAGE'在'AndroidManifest.xml'中設置。但是在一些舊的遺留類中,我們由於某種奇怪的原因生成了一個新的RequestQueue ......現在它正在工作。感謝您的幫助!! – Ben