为了账号安全,请及时绑定邮箱和手机立即绑定

Android webview提升打开速度方案

标签:
Android
实现原理


https://img1.sycdn.imooc.com//5d2c82220001cfdc09640055.jpg


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


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消