Android webview提升打开速度方案

作者: 蓝库知识 | 来源:发表于2018-11-15 16:02 被阅读25次
前言

为了提高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;
    }

然后完成操作!

喵印~~~

相关文章

网友评论

    本文标题:Android webview提升打开速度方案

    本文链接:https://www.haomeiwen.com/subject/hojyfqtx.html