公司项目采用的是JS 与原生webView交互的方式实现的,使用H5页面需要面对的问题就是缓存
如果不使用缓存,每次从网络获取如果当网络环境较差的时候,用户体验那是相当的不好,而使用缓存当H5做了修改,没有及时更新而依旧使用缓存,头大的该是Android开发者了。
先介绍一下WebView 几种缓存模式,知道的同学直接略过。
LOAD_CACHE_ONLY | 不使用网络,只读取本地缓存数据 |
LOAD_DEFAULT | 根据cache-control决定是否从网络上取数据 |
LOAD_CACHE_NORMAL | API level 17中已经废弃,从API level 11开始作用同LOAD_DEFAULT模式 |
LOAD_NO_CACHE | 不使用缓存,只从网络获取数据 |
LOAD_CACHE_ELSE_NETWORK | 只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。本地没有缓存时才从网络上获取 |
默认的时候 也就是WebView 不设置的模式是LOAD_DEFAULT。
1px缓存策略
app启动的时候加载一个1px的WebView,使其产生缓存方便下次进入 重新加载。
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); //设置 缓存模式
// 开启 DOM storage API 功能
webView.getSettings().setDomStorageEnabled(true);
//开启 database storage API 功能
webView.getSettings().setDatabaseEnabled(true);
String cacheDirPath = getCacheDir().getAbsolutePath();
//设置数据库缓存路径
webView.getSettings().setGeolocationDatabasePath(cacheDirPath);
//设置 Application Caches 缓存目录
webView.getSettings().setAppCachePath(cacheDirPath);
//开启 Application Caches 功能
webView.getSettings().setAppCacheEnabled(true);
有关WebView 使用封装的工具类
这里需要注意的是在最后我选择的缓存模式为LOAD_CACHE_ELSE_NETWORK
public class WebUtils {
public static void initWebView(WebView webView, String cacheDirPath) {
WebSettings webSettings = webView.getSettings();
webSettings.setAllowFileAccessFromFileURLs(true);
webSettings.setJavaScriptEnabled(true);
webSettings.setAppCacheEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.supportMultipleWindows();
webSettings.setAllowContentAccess(true);
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setSavePassword(true);
webSettings.setSaveFormData(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setLoadsImagesAutomatically(true);
// 开启 DOM storage API 功能
webSettings.setDomStorageEnabled(true);
//开启 database storage API 功能
webSettings.setDatabaseEnabled(true);
//设置数据库缓存路径
webSettings.setDatabasePath(cacheDirPath);
//设置 Application Caches 缓存目录
webSettings.setAppCachePath(cacheDirPath);
//开启 Application Caches 功能
webSettings.setAppCacheEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
}
}
项目中的使用
private void initWebView() {
//缓存路径
String cacheDirPath = getFilesDir().getAbsolutePath();
WebUtils.initWebView(webView, cacheDirPath);
webView.setWebChromeClient(new MainWebChrome());
webView.setWebViewClient(new MainWebClient());
loadMainWeb();
//与JS 交互设置的方法
webView.addJavascriptInterface(new WebHost(), "android");
}
通过url加载WebView
public void loadMainWeb() {
String url = HttpConstants.getInstances().getBaseWeb();
webView.loadUrl(url);
}
清除缓存的方法
可以通过推送 触发此方法,从而清除缓存重新加载页面。
clearCacheX();
//清除历史数据
webView.clearHistory();
//清除 表单数据
webView.clearFormData();
// 重新加载页面
loadMainWeb();
删除缓存文件
private void clearCacheX() {
File file = getCacheDir().getAbsoluteFile();//删除缓存
deleteFile(file);
}
public void deleteFile(File file) {
if (file.exists()) {
if (file.isFile()) {
file.delete();
} else if (file.isDirectory()) {
File files[] = file.listFiles();
for (int i = 0; i < files.length; i++) {
deleteFile(files[i]);
}
}
file.delete();
}
}
完美解决 使用 缓存以及清除缓存的问题! 目前项目中正在使用,亲测有效。