HTTPResponseCache 存储但从不命中
HTTPResponseCache stores but never hits
我正在 Android 开发一个应用程序,它有大量的网络服务请求。
我已经有一个 LoginActivity,用户可以在其中输入用户名和密码,服务器使用结果和令牌进行响应。然后,几个活动(所有活动都从公共 BaseActivity 扩展而来)执行繁重的请求。
我还有一个 ServiceManager class 负责所有服务请求和 HTTP 请求。
我正在努力实施 HttpResponseCache 以减轻此网络负载。现在我有以下代码:
在我的 LoginActivity 的(第一个被启动的)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);
}
在我的 ServiceManager 的 httpRequest 函数中,这是我每次尝试发出 HTTP 请求时实际执行的函数:
//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();
}
现在,由于服务器端尚未准备就绪,我正在向其发送请求的 URL 始终相同。
如您所见,我正在调试一些东西,这些是结果:
- 已安装缓存
- 缓存:android.net.http.HttpResponseCache@b3e3b6
- 净数:X
- 命中数:0
- 请求数:X
- {myJson}
如您所见,当我通过 cache.get() 方法获取 JSON 时,缓存能够读取它,但它永远不会命中。
响应的 header 中我的服务器端指令 Cache-Control 是:
Cache-Control:public
Cache-Control:max-age=3800
为什么缓存从不命中?
非常感谢!
我发现了问题。
我试图将请愿缓存到 PHP returns JSON。 PHP 始终被视为动态内容(实际上是),并且从不缓存。
尝试缓存时要遵循的路径 JSON y 仅在应用程序端而非服务器端。这样,它就不会发出请求了。
最佳。
编辑
毫无疑问,解决此类问题的最佳方法是使用 Volley
我正在 Android 开发一个应用程序,它有大量的网络服务请求。
我已经有一个 LoginActivity,用户可以在其中输入用户名和密码,服务器使用结果和令牌进行响应。然后,几个活动(所有活动都从公共 BaseActivity 扩展而来)执行繁重的请求。
我还有一个 ServiceManager class 负责所有服务请求和 HTTP 请求。
我正在努力实施 HttpResponseCache 以减轻此网络负载。现在我有以下代码:
在我的 LoginActivity 的(第一个被启动的)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);
}
在我的 ServiceManager 的 httpRequest 函数中,这是我每次尝试发出 HTTP 请求时实际执行的函数:
//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();
}
现在,由于服务器端尚未准备就绪,我正在向其发送请求的 URL 始终相同。
如您所见,我正在调试一些东西,这些是结果:
- 已安装缓存
- 缓存:android.net.http.HttpResponseCache@b3e3b6
- 净数:X
- 命中数:0
- 请求数:X
- {myJson}
如您所见,当我通过 cache.get() 方法获取 JSON 时,缓存能够读取它,但它永远不会命中。
响应的 header 中我的服务器端指令 Cache-Control 是: Cache-Control:public Cache-Control:max-age=3800
为什么缓存从不命中?
非常感谢!
我发现了问题。
我试图将请愿缓存到 PHP returns JSON。 PHP 始终被视为动态内容(实际上是),并且从不缓存。
尝试缓存时要遵循的路径 JSON y 仅在应用程序端而非服务器端。这样,它就不会发出请求了。
最佳。
编辑
毫无疑问,解决此类问题的最佳方法是使用 Volley