2015-11-09 5 views
2

Я пытаюсь получить Volley для работы с его Cache. Когда я получаю 304getCacheEntry().data является null, хотя "cache-control" установлен. Вот что я делаю:Volley Cache возвращает null при получении 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 я получаю ответ 200 с "cache-control" набором для "max-age=180, public". До сих пор так хорошо?

  3. Если запрос GET делается дважды или более, я установил "If-Modified-Since" с последней меткой времени, запрошенной в заголовок запроса.
  4. Второй раз, когда я запрашиваю конкретную конечную точку API, сервер ответит 304. getCacheEntry().data возвращает null. Если я проверил cache entries в VolleysRequestQueue Я не могу найти запись для моего конкретного запроса.

Что я делаю неправильно? По какой-то причине у меня есть один запрос, который всегда кэшируется при однократном запуске. Это даже один, который возвращает много данных. Но все остальные запросы не кэшируются. Следующий фрагмент кода анализирует ответ и проверяет наличие 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

Спасибо @BNK это запрос GET, хотя – Ben

+0

Если сервер опубликован в Интернете, pls отправляет URL-адрес, чтобы я мог проверить завтра – BNK

ответ

0

ИМХО, запись в кэше всегда пустая (не только при получении 304 соотв кода), из-за следующим:

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

Пожалуйста, проверьте c.getCacheDir(), чтобы увидеть, если вы хотите использовать внешние устройства хранения данных для хранения кэша данных, тогда вы должны установить WRITE_EXTERNAL_STORAGE разрешение внутри файла AndroidManifest.xml.

Надеюсь, это поможет!

+0

Я решил эту проблему! 'WRITE_EXTERNAL_STORAGE' установлен в' AndroidManifest.xml'. Но в каком-то старом классе legacy мы создали новую 'RequestQueue' по какой-то странной причине ... теперь она работает. Спасибо за помощь!! – Ben

Смежные вопросы