WebView搭载服务器端html, js,请求图片大,请求次数多的情况下,网页加载速度很慢。
网页加载速度慢这个问题Native+web content混合模式下如何一定程度上改善呢,这篇小文里探讨一下。
(1)缓存模式。
setCacheMode方法可以设置缓存模式。
缓存模式有5种。意义如下。(转载自网络)
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,都使用缓存中的数据。
当设置Load_default时,由服务器端的cache-control决定是否使用缓存。服务器端cache-control设为no-cache时,
无论如何都会从网络上取数据。
我们项目服务器端用的cache-control设置的no-cache,所以缓存策略设置为load_default,但是实际上却没有什么卵用。
如果服务器端cache-control设置为cache时,确实网页加载速度变得非常快。
(2)图片或者大的JS文件本地保存
拦截http请求,如果请求图片或者大size的JS文件,比如jquery库, jquery mobile库,直接从本地取得资源并返给web端。
重写WebViewClient的shouldInterceptRequest方法。
<思路>
拦截url,从url得到文件后缀和名字。判断本地是否有此文件。有则通过本地文件得到WebResourceResponse实例返回。
贴代码如下。
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) { WebResourceResponse response = null;
InputStream localCopy = null;
//response by default
response = super.shouldInterceptRequest(view, url);
//if local file, then response local content
String mineType = "image/png"; //for png file
String[] urlSplit = url.split("/");
String fileName = null;
if ((urlSplit != null) && (urlSplit.length != 0)) {
fileName = urlSplit[urlSplit.length-1];
if (fileName.endsWith("js")) {
//for js file
mineType = "application/javascript";
} else if (fileName.endsWith("gif")){
mineType ="image/gif";
} else {
return response;
}
}
if ((fileName != null) && (cacheFile != null)) {
for (String cacheFileName : cacheFile) {
if (fileName.equals(cacheFileName)) {
try {
localCopy = MyApplication.getInstance().getAssets().open(cacheDir + "/"+ cacheFileName);
response = new WebResourceResponse(mineType, "UTF-8", localCopy);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return response;
}