Android WebView 优化梳理

作者:Mino

Android WebView 优化梳理

文章插图
 
1.针对加载webView中的资源时加快加载的速度优化(主要是针对图片)原因:html代码下载到WebView后 , webkit开始解析网页各个节点 , 发现有外部样式文件或者外部脚本文件时 , 会异步发起网络请求下载文件 , 但如果在这之前也有解析到image节点 , 那势必也会发起网络请求下载相应的图片 。在网络情况较差的情况下 , 过多的网络请求就会造成带宽紧张 , 影响到css或js文件加载完成的时间 , 造成页面空白loading过久 。
解决方法:告诉WebView先不要自动加载图片 , 等页面finish后再发起图片加载 。
//设置是否开启密码保存功能 , 不建议开启 , 默认已经做了处理 , 存在盗取密码的危险WebView.setSavePassword(false);2.WebView硬件加速导致页面渲染闪烁原因:4.0以上的系统我们开启硬件加速后 , WebView渲染页面更加快速 , 拖动也更加顺滑 。但有个副作用就是 , 当WebView视图被整体遮住一块 , 然后突然恢复时(比如使用SlideMenu将WebView从侧边滑出来时) , 这个过渡期会出现白块同时界面闪烁 。
解决方法:是在过渡期前将WebView的硬件加速临时关闭 , 过渡期后再开启 。
/** * 请求网络出现error * @param viewview * @param errorCode错误 * @param descriptiondescription * @param failingUrl失败链接 */@Overridepublic void onReceivedError(WebView view, int errorCode, String description, StringfailingUrl) {super.onReceivedError(view, errorCode, description, failingUrl);if (errorCode == 404) {//用JAVAscript隐藏系统定义的404页面信息String data = "Page NO FOUND!";view.loadUrl("JavaScript:document.body.innerHTML="" + data + """);} else {if (webListener!=null){webListener.showErrorView();}}}// 向主机应用程序报告Web资源加载错误 。这些错误通常表明无法连接到服务器 。// 值得注意的是 , 不同的是过时的版本的回调 , 新的版本将被称为任何资源(iframe , 图像等)// 不仅为主页 。因此 , 建议在回调过程中执行最低要求的工作 。// 6.0 之后@Overridepublic void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {super.onReceivedError(view, request, error);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {X5WebUtils.log("服务器异常"+error.getDescription().toString());}//ToastUtils.showToast("服务器异常6.0之后");//当加载错误时 , 就让它加载本地错误网页文件//mWebView.loadUrl("file:///Android_asset/errorpage/error.html");if (webListener!=null){webListener.showErrorView();}}/** * 这个方法主要是监听标题变化操作的 * @param viewview * @param title 标题 */@Overridepublic void onReceivedTitle(WebView view, String title) {super.onReceivedTitle(view, title);if (title.contains("404") || title.contains("网页无法打开")){if (webListener!=null){webListener.showErrorView();}} else {// 设置title}}3.可以提前显示加载进度条原因:WebView.loadUrl("url") 不会立马就回调 onPageStarted 或者 onProgressChanged 因为在这一时间段 , WebView 有可能在初始化内核 , 也有可能在与服务器建立连接 , 这个时间段容易出现白屏 , 白屏用户体验是很糟糕的 。
解决方法:提前显示进度条虽然不是提升性能  ,  但是对用户体验来说也是很重要的一点 。
/** * 在加载资源时通知主机应用程序发生SSL错误 * 作用:处理https请求 * @param viewview * @param handlerhandler * @param errorerror */@Overridepublic void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {super.onReceivedSslError(view, handler, error);if (error!=null){String url = error.getUrl();}//https忽略证书问题if (handler!=null){//表示等待证书响应handler.proceed();// handler.cancel();//表示挂起连接 , 为默认方式// handler.handleMessage(null);//可做其他处理}}4.WebView密码明文存储漏洞优化原因:WebView 默认开启密码保存功能 mWebView.setSavePassword(true) , 如果该功能未关闭 , 在用户输入密码时 , 会弹出提示框 , 询问用户是否保存密码 , 如果选择”是” , 密码会被明文保到 /data/data/com.package.name/databases/webview.db 中 , 这样就有被盗取密码的危险 。
解决方法:通过 WebSettings.setSavePassword(false) 关闭密码保存提醒功能 。


推荐阅读