前言
为了提高WebView的加载速度,提升用户体验,WebView优化方案如下:
思路:
让WebView打开时加载本地的文件,进而缩短网页中文件请求的时间,达到提升打开速度的效果。
实现:
首先从后端下载开启WebView需要的相关文件数据包,存储在本地。之后加载本地的html模版,将css、js文件利用本地文件进行拦截替换。加载界面框架完成后,后端调用前端的方法获得界面显示的数据,显示网页内容。
为了方便前后端的方法调用,此次采用的方案是利用Dsbridge加载网页DSBridge官方文档。
具体步骤
1.请求后台获得要加载的数据包(zip包),下载->解压->存储(网上很多关于文件操作的相关demo)
zip包中包含html文件、以及html文件中所有的加载文件eg:css文件,js文件
2.对webview初始化,以及设置需要的Settings属性
3.注入方法,实现android和js的交互,后端通过调用移动端的方法获得网页显示的具体内容
4.获得本地html地址,加载本地html
5.实施拦截操作
拦截操作有两种情况:一种是直接返回本地文件,另一种则是加载url返回加载结果(因为当替换完url后,此方法并不会主动加载url,故需要自己请求加载,最后将返回的数据返回才可以)。
wv_news.setWebViewClient(new WebViewClient() {
省略无用的····
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
//根据版本号更新数据包
String version = PrefUtils.getString(context, "code", "");
File file = null;
Uri uri = Uri.parse(url);
//abc 自定义的协议名,为方便替换
if (uri.getScheme().equals("abc")) {
String picName = url.substring(url.lastIndexOf("/") + 1);//文件名
String suffix = picName.substring(picName.indexOf(".") + 1);//后缀
//path 为根据拦截的数据拼接成的本地文件地址,利用匹配到的本地文件替换源文件中的
file = new File(path);
if (!file.exists()) {
//保险文件地址,万一存储的文件出了问题,救急用的
url = getBaseUrl() + suffix + "/" + picName;
return getDataWeb(url);
} else {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
WebResourceResponse response = new WebResourceResponse(
MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url))
, "UTF-8", fis);
return response;
}
}
return super.shouldInterceptRequest(view, url);
}
});
}
}
加载保险地址的内容返回的数据
public static WebResourceResponse getDataWeb(String newUrl) {
HttpURLConnection conn = null;//声明连接对象
try {
URL url = new URL(newUrl); //URL对象
conn = (HttpURLConnection) url.openConnection(); //使用URL打开一个链接,下面设置这个连接
conn.setRequestMethod("GET"); //使用get请求
if (conn.getResponseCode() == 200) {//返回200表示连接成功
String contentType = conn.getContentType();
if (contentType != null) {
String mimeType = contentType;
if (contentType.contains(";")) {
mimeType = contentType.split(";")[0].trim();
}
return new WebResourceResponse(mimeType, conn.getContentEncoding(), conn.getInputStream());
}
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
然后完成操作!
喵印~~~
网友评论