gpt4 book ai didi

android - 我可以将 Android 4 HttpResponseCache 与基于 WebView 的应用程序一起使用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:01 25 4
gpt4 key购买 nike

我正在开发一个基于 WebView 的应用程序,该应用程序当前在 v3.1 平板电脑上运行。我似乎无法让 WebView 缓存 css、js 和图像(或使用缓存)。该应用似乎总是连接到服务器,服务器返回 304 响应(HTML 页面是动态的,总是需要使用服务器)。

我想知道 HttpResponseCache(在 v4 下可用)是否与 WebViewClient 一起工作,或者 WebView 是否应该已经管理 HTTP 资源的缓存。

谢谢。

最佳答案

经过一些测试,我发现Webkit的Android层没有使用URLConnection进行HTTP请求,这意味着HttpResponseCache不能像其他原生场景一样自动挂接到WebView。

所以我尝试了另一种方法:使用自定义 WebViewClient 来桥接 WebView 和 ResponseCache:

webview.setWebViewClient(new WebViewClient() {
@Override public WebResourceResponse shouldInterceptRequest(final WebView view, final String url) {
if (! (url.startsWith("http://") || url.startsWith("https://")) || ResponseCache.getDefault() == null) return null;
try {
final HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.connect();
final String content_type = connection.getContentType();
final String separator = "; charset=";
final int pos = content_type.indexOf(separator); // TODO: Better protocol compatibility
final String mime_type = pos >= 0 ? content_type.substring(0, pos) : content_type;
final String encoding = pos >= 0 ? content_type.substring(pos + separator.length()) : "UTF-8";
return new WebResourceResponse(mime_type, encoding, connection.getInputStream());
} catch (final MalformedURLException e) {
e.printStackTrace(); return null;
} catch (final IOException e) {
e.printStackTrace(); return null;
}
}
});

当你需要离线访问缓存资源时,只需添加一个缓存头即可:

connection.addRequestProperty("Cache-Control", "max-stale=" + stale_tolerance);

顺便说一句,为了使这种方法正常工作,您需要正确设置您的网络服务器以使用启用缓存的“Cache-Control” header 进行响应。

关于android - 我可以将 Android 4 HttpResponseCache 与基于 WebView 的应用程序一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12063937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com