由于我目前的应用大部分为html网页内容,所以之前一直沿用webview.load(url)的方式来加载网页,所以就出现了很多网页加载很慢的情况,看网上所述大部分由加载远程加载js,css导致的。所以就把webview.load(url)调整为加载本地内容,js和css均有本地html文件加载。着实速度提升了不少。是的,js交互事件也是本地的!而网页内容是接口实时返回的。
1,现在本地assets文件下创建一个html源文件,包含一些head和要交互的js事件
例:openActivity()为预设js事件。<style>img为网页内容中的图片适应设置。viewport为网页适应手机屏幕大小。
<div id="mobile_content">为实际加载的网页内容的控件标签,所有从网络获取的网页内容代码均会加载在这个 div中。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2, minimum-scale=1, user-scalable=yes">
<style> img {max-width:100%; box-sizing: border-box; vertical-align: middle;}
</style>
</head>
<body>
<div class="content">
<div id="mobile_content"></div>
<script type="text/javascript">
function openActivity(type,id){
window.Android.openActivity(type,id);
}
</script>
</div>
</body>
</html>
2,由于assets文件下的文件是不具备写入权限,所以我们需要首次打开应用时将html源文件copy到sd卡上
不赘述
3,将准本好的将要加载的实际网页内容添加到html中供webview加载
// 使用Jsoup获取本地html文件并将内容填充到html文件中
Document doc = Jsoup.parse(FileUtils.readFileSdcard(FileUtils.SDPATH + "index.html"));//Jsoup解析文件
//Joup解析url网址 Jsoup.connect(url).get();
//获取加载内容的div标签
Element e = doc.getElementById("mobile_content");
e.append("写入从接口中获取的实际的网页内容代码");
String content = doc.html();
//加载
mWebView.loadDataWithBaseURL(FileUtils.SDPATH+ "index.html", content, "text/html", "utf-8", "");
4,阻塞图片加载,内容加载完后再开启图片加载
mWebView.getSettings().setLoadsImagesAutomatically(false);阻塞加载
mWebView.getSettings().setLoadsImagesAutomatically(true);关闭阻塞加载
5,本地js事件设置
class JavaScriptInterface {
@JavascriptInterface
public void openActivity(String type, String id) {
}
@JavascriptInterface
@Override
public String toString() {
return "Android";
}
}
mWebView.addJavascriptInterface(new JavaScriptInterface(), "Android");
到此处,O了!