天天看点

android webview 加载过程,Android webview提升打开速度方案

实现原理

android webview 加载过程,Android webview提升打开速度方案

1.随便打开一个网址,查看网页源码,网页中都有如上的一些链接,想打开网址必然要加载完网页中的那些链接。但是加载那些文件需要时间,因此加载webview就会变慢。那如果我把那些需要加载的文件换为本地的,直接获取,打开网页是不是就省好多时间,一下子就提升了网页的打开速度。

2.由于App中存在一类H5的布局样式相同,所以可以做一个模板,架子一样,填的具体内容不同。

原理:加载模版,利用本地文件直接返回给网页模板需要加载的文件,加载好后只需更改显示内容。

注意:由于担心网络问题,可能文件数据包下载不下来,故会在开启App的时候返回一个保险html的网址,当本地没有数据包的时候,则加载保险html。

实现步骤

1.从后端下载开启WebView需要的相关文件数据包(网页中需要请求的文件)以及模板html,存储在本地

2.初始化webview

3.注入方法,实现android和js的交互,后端通过调用移动端的方法获得网页显示的具体内容

4.加载本地模板html文件

5.实施拦截操作,返回模板html需要的资源文件

拦截操作有两种情况:一种是直接返回本地文件,另一种则是加载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;

}

然后完成操作!

为了方便前后端的方法调用,此次采用的方案是利用Dsbridge加载网页DSBridge官方文档。

喵印~~~

作者:喵主子的阳光

链接:https://www.jianshu.com/p/abd51329b4f5