WebView 缓存不起作用
WebView cache doesn't work
我正在尝试为我的应用程序中 activity 之一加载的 webView 实现缓存。但是当我关闭当前的 wifi 网络时,我无法加载我的 webview。
我的网络视图:
progDialog = ProgressDialog.show(activity, "Loading", "Please wait...", true);
progDialog.setCancelable(false);
webView = (WebView) findViewById(R.id.my_web_view);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setAppCachePath(getApplicationContext().getCacheDir().getAbsolutePath());
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
progDialog.show();
if(isNetworkAvailable()){
view.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
view.loadUrl(url);
}
else{
view.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY/*LOAD_CACHE_ELSE_NETWORK*/);
view.loadUrl(url);
}
return true;
}
@Override
public void onPageFinished(WebView view, final String url) {
progDialog.dismiss();
}
});
webView.loadUrl("http://www.google.com/");
我尝试过使用这个方法可以知道我的webView内容是否保存在缓存中(不确定是否非常正确,只是测试):
private void isCacheFileCreated(){
String uri = "http://www.google.com/";
String hashCode = String.format("%08x", uri.hashCode());
File cacheFile = new File(new File(getCacheDir(), "webviewCache"), hashCode);
if (cacheFile.exists()){
// cache ok
} else {
// no cache
}
}
但是当我的网络关闭时,file.exist() 总是错误的。
我的基本流程是:启动我的应用程序 > 使用 webView 转到我的 activity 并显示 url 内容 > 关闭 wifi > 返回到我的应用程序 > 返回到 webview activity > 在这里我收到一条错误消息 "Webpage not available"。
清单中的权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
isNetworkAvailable() 方法:
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
Google设置cache-control:no-cache
header,所以它的内容不会被WebView缓存。尝试使用可以控制响应的服务器。
其他一些注意事项:
AppCache 不是一般的网络缓存,您的网络应用程序必须明确使用它(参见 docs);因此打开它也无济于事;
从 shouldOverrideUrlLoading
内部执行 loadUrl
没有必要(有时会导致令人惊讶的结果),您可以只 return false
;
不确定您为什么假设网络缓存使用特定的文件命名方案——这是一个实现细节。
我正在尝试为我的应用程序中 activity 之一加载的 webView 实现缓存。但是当我关闭当前的 wifi 网络时,我无法加载我的 webview。
我的网络视图:
progDialog = ProgressDialog.show(activity, "Loading", "Please wait...", true);
progDialog.setCancelable(false);
webView = (WebView) findViewById(R.id.my_web_view);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setAppCachePath(getApplicationContext().getCacheDir().getAbsolutePath());
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
progDialog.show();
if(isNetworkAvailable()){
view.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
view.loadUrl(url);
}
else{
view.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY/*LOAD_CACHE_ELSE_NETWORK*/);
view.loadUrl(url);
}
return true;
}
@Override
public void onPageFinished(WebView view, final String url) {
progDialog.dismiss();
}
});
webView.loadUrl("http://www.google.com/");
我尝试过使用这个方法可以知道我的webView内容是否保存在缓存中(不确定是否非常正确,只是测试):
private void isCacheFileCreated(){
String uri = "http://www.google.com/";
String hashCode = String.format("%08x", uri.hashCode());
File cacheFile = new File(new File(getCacheDir(), "webviewCache"), hashCode);
if (cacheFile.exists()){
// cache ok
} else {
// no cache
}
}
但是当我的网络关闭时,file.exist() 总是错误的。
我的基本流程是:启动我的应用程序 > 使用 webView 转到我的 activity 并显示 url 内容 > 关闭 wifi > 返回到我的应用程序 > 返回到 webview activity > 在这里我收到一条错误消息 "Webpage not available"。
清单中的权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
isNetworkAvailable() 方法:
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
Google设置cache-control:no-cache
header,所以它的内容不会被WebView缓存。尝试使用可以控制响应的服务器。
其他一些注意事项:
AppCache 不是一般的网络缓存,您的网络应用程序必须明确使用它(参见 docs);因此打开它也无济于事;
从
shouldOverrideUrlLoading
内部执行loadUrl
没有必要(有时会导致令人惊讶的结果),您可以只 returnfalse
;不确定您为什么假设网络缓存使用特定的文件命名方案——这是一个实现细节。