首先先声明一下工作中遇到的问题,我们项目在晚上九点的时候,是一个高峰期。由于服务器高并发没有优化好,在短时间内要做一下解决方案。
还有一个是优化加载webview的加载速度。这个放在后面说。
场景,晚上九点,是用户活跃高峰期,导致原生App端,打开H5页面,需要请的CSS和JS这些文件特别的慢,所有H5页面会在App上显示布局错乱,显示有问题等情况!以下做出了几种方案。(当然后台解决高并发是核心关键
第一:把H5打包成zip文件上传服务器。然后App启动的时候设置一个进度条下载到本地,然后解压。打开本地的HTML,CSS这样,图像,JS文件就全部在本地了,就不会出现高峰期再去请求服务器页面显示错误了。更新只需要删除文件重新下载即可
第二:。使用缓存策略解决这个问题从缓存读取CSS和静态文件更新只需要清空缓 即可。 先介绍一下缓存 当我们加载的Html时候,会在我们的数据/应用包下生成数据库与缓存两个文件夹: 我们请求的地址记录是保存在webviewCache.db里,而URL的内容是保存在webviewCache文件夹下。
当我们加载的Html时候,会在我们的数据/应用包下生成数据库与缓存两个文件夹:
我们请求的Url记录是保存在webviewCache.db里,而url的内容是保存在webviewCache文件夹下.
WebView中存在着两种缓存:网页数据缓存(存储打开过的页面及资源)、H5缓存(即AppCache)
我们请求的Url记录是保存在webviewCache.db里,而url的内容是保存在webviewCache文件夹下.
WebView中存在着两种缓存:网页数据缓存(存储打开过的页面及资源)、H5缓存(即AppCache)
一、网页缓存
1、缓存构成
/data/data/package_name/cache/
/data/data/package_name/database/webview.db
/data/data/package_name/database/webviewCache.db
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,都使用缓存中的数据。
如:www.taobao.com的缓存控制为无缓存,在模式LOAD_DEFAULT下,无论如何都会从网络上取数据,如果没有网络,就会出现错误页面;在LOAD_CACHE_ELSE_NETWORK模式下,无论是否有网络,只要本地有缓存,都使用缓存。本地没有缓存时才从网络上获取。
www.360.com.cn的cache-control为max-age = 60,LOAD_DEFAULT模式下缓存60秒,意思就是60后访问才能重新请求服务器。但是,这60秒后发生了数据的改变也会及时更新缓存的,所以显示也没有问题。现在保存的是css和静态文件图片,部分js。下次进入页面的时候不会再请请这些保存的东西,会直接从本地取,但是还有一点是,如果60秒时间到,他也不会去重新网络请求这些东西,60后秒的英文只不过请求服务器再次,(这可能返回304了,又在本地取了)。这一定要清楚.PS(只有删除缓存才会重新去服*务器获取CSS文件;静态文件)所以现在也能解决我们高并发那个问题。
直接配置缓存
private void initWebView() {
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings()setRenderPriority(RenderPriority.HIGH)。
。mWebView.getSettings()setCacheMode(WebSettings.LOAD_DEFAULT); //设置缓存模式
//开启DOM存储API功能
mWebView.getSettings()。setDomStorageEnabled(true);
//开启数据库存储API功能
mWebView.getSettings()。setDatabaseEnabled(true);
String cacheDirPath = getFilesDir()。getAbsolutePath()+ APP_CACAHE_DIRNAME;
// String cacheDirPath = getCacheDir()。getAbsolutePath()+ Constant.APP_DB_DIRNAME;
Log.i(TAG,“cacheDirPath =”+ cacheDirPath);
//设置数据库缓存路径
.mWebView.getSettings(&#