Search code examples
androidcachinghttpresponsecache

HTTPResponseCache stores but never hits


I'm working on a application in Android which has a heavy load of web service requests.

I already have a LoginActivity in which the user introduces the username and the password and the server responses with the result and a token. Then, several activities (all of them extend from a common BaseActivity) do the heavy requests.

I have also a ServiceManager class which is responsible for all the service requests and HTTP petitions.

I'm working on implementing the HttpResponseCache to relieve this net load. Right now I have the following code:

In my LoginActivity's (the first being launched) onCreate:

//HTTP cache
try {
    File httpCacheDir = new File(this.getCacheDir(), "http");
    long httpCacheSize = 10 * 1024 * 1024; //10 MiB
    HttpResponseCache.install(httpCacheDir, httpCacheSize);
    Log.d(TAG, "Cache installed");
} catch (IOException e) {
    Log.i(TAG, "HTTP response cache installation failed:" + e);
}

In my ServiceManager's httpRequest function, which is the one actually being executed every time I try to make an HTTP request:

//HTTPS connection
URL requestedUrl = new URL(uri);
httpsConnection = (HttpURLConnection) requestedUrl.openConnection();
httpsConnection.setUseCaches(true);
httpsConnection.setDefaultUseCaches(true);
httpsConnection.setRequestMethod("GET");

BufferedReader br = new BufferedReader(
            new InputStreamReader(httpsConnection.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
     httpResponse += line;
}

br.close();
httpsConnection.disconnect();

HttpResponseCache cache = HttpResponseCache.getInstalled();

Log.d(TAG, "Cache: " + cache);
if (cache != null) {
   Log.d(TAG, "Net count: " + cache.getNetworkCount());
   Log.d(TAG, "Hit count: " + cache.getHitCount());
   Log.d(TAG, "Request count: " + cache.getRequestCount());

   cache.flush();
}
try{
    URI uriCached =  new URI("<myurl>");
    CacheResponse cr = cache.get(uriCached, "GET", null);
    String line;
    BufferedReader br = new BufferedReader(new InputStreamReader(cr.getBody()));
    while ((line = br.readLine()) != null) {
        Log.d(TAG, line);
    }
} catch (URISyntaxException e1) {
    e1.printStackTrace();
} catch (IOException e2) {
    e2.printStackTrace();
}

Right now, since the server side is not ready, the URL I'm doing the requests to is always the same.

As you can see, I'm debugging a few things, these are the results:

  • Cache installed
  • Cache: android.net.http.HttpResponseCache@b3e3b6
  • Net count: X
  • Hit count: 0
  • Request count: X
  • {myJson}

As you can see, the cache is able to read my JSON when I get it via the cache.get() method, but it's never hitting.

My server side directive Cache-Control in the header of the response is: Cache-Control:public Cache-Control:max-age=3800

Why is the cache never hitting?

Thank you very much!


Solution

  • I found the problem.

    I was trying to cache petitions to a PHP that returns JSON. PHP is always considered as dynamic content (and it actually is), and it's never cached.

    The path to follow when trying to cache JSON y application-side only and not server-side. This way, it won't event make a request.

    Best.

    EDIT

    Best solution for this kind of trouble is, undoubtedly, to use Volley