WebView采坑(一)
使用webview,你可长点心
为什么要写这篇文章,其实对于webview,说简单也简单,说困难也困难。简单在于如果你只是为了简单展示网页或者本地html的话就简单,困难在于你要实现的功能多了,那就会到处都是坑。所以写webview功能的时候你要格外细心,测试的时候要认真测试。
因为坑太多,可能有些我也记不起来(这就是不及时做笔记的下场),所以想到什么写什么,也不按什么顺序或者什么结构去列举,就想到什么列什么。
1. WebViewClient的shouldOverrideUrlLoading和onReceivedError
先从简单的开始讲。
首先如果你要自定义WebViewClient的话要注意一下这两个方法,在高版本和低版本中两个方法传的参数也不同。
(1)shouldOverrideUrlLoading
// 高版本 public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return super.shouldOverrideUrlLoading(view, request); } // 低版本 public boolean shouldOverrideUrlLoading(WebView view, String url) { return super.shouldOverrideUrlLoading(view, url); }
(2)onReceivedError
// 高版本 public boolean onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { return super.onReceivedError(view, request, error); } // 低版本 public boolean onReceivedError(WebView view, int errorCode, String description, String failingUrl) { return super.onReceivedError(view, errorCode, description, failingUrl); }
还有shouldInterceptRequest方法也是等等,在高版本下使用String 没问题,但是在低版本下是无法找到WebResourceRequest类的,也就是会报红。
甚至不仅如此,还会出现其它的问题,所以如果要使用这两个方法的话需要多留意一点。
2. 监听加载完成
平时我们可能会在加载网页的时候等进行监听,很多监听使用的是重写WebViewClient的onPageFinished方法
public void onPageFinished(WebView view, String url) { ...... }
但是这个方法并不能很准确的判断页面加载完成,比如说webview里面展示的首页跳转到另外的Url,有时候明明还是显示着跳转时的白屏,却依然调用onPageFinished方法。
而我们可以使用WebChromeClient中重写onProgressChanged方法,
@Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); if (newProgress > 70) { ...... } }
这个方法可以监听进度,可以判断如果newProgress等于100,那就是真正的页面加载完成,但是我这是判断大于75就算是页面加载完成。为什么这样做了,因为首先newProgress的值不是+1的递增,而是没法判断,有时候+10递增,有时候+20递增。而当页面加载到70左右的时候,其实页面已经是可以显示出来了,然后再加载资源。但是如果我判断100的话,有时候其实页面是能正常显示的,但是资源有问题,导致进度到不了100反而走了失败的回调。认真想想,难道每次仅仅因为一张图片加载不出来我们就宣布这个页面加载失败吗?所以我才判断70,我不知道这样做是不是最好的方法,但是至少测试的时候对于大部分情景都是没问题的。
我认为最好的做法就是封装起来,然后自己写一套生命周期流程,再向外提供钩子。至于内部的逻辑怎么判断,我这边也不敢说我做的判断就是完美的,但是用newProgress去判断页面加载是否完成的准确性还是比较高的。
3. SSL证书问题
这个比较好办,如果出现这个问题,重写这个方法,记得把super去掉
@Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); }
4. Dialog中使用webview的坑
如果在Dialog中使用webview的过程中会因为逻辑出现一点问题。这里只是举个栗子,也可能其它地方会有类似的问题,我的意思是使用webview如果不细心的话,可能会在逻辑上出现问题。
言归正传,说说我的问题。
当我在webview跳转url的时候关闭Dialog,但是这样webview依旧会做拦截的操作,即使我在关闭时设置webview等于空也没有用,我能想到的就是写个方法去关闭webview的全部监听。
5. webview拦截不到链接
有时候你会发现webview可能拦截不到链接,shouldOverrideUrlLoading方法不被调用。这会有很多原因引起,百度就能收到。我这里就只说一种情况:
有人这样说的:第一个链接不是重定向的话就拦截不到
所以有的人会感觉到好像是第一个链接如果是加载http连接就能正常拦截到,但是加载https就拦截不到,那是因为那些http连接会重定向到https。
虽然这个说法是这样说,但我反倒是觉得就是webview不会拦截到第一个url,而重定向能拦截到是因为重定向相当于跳转url,而重定向后的就是第2个url,所以就能被拦截到。
想要链接到的办法也很简单
如果链接是你家的,可以自己手动搞个重定向,如果链接不是你家的,可以自己写个监听在loadurl之前。
6. onReceivedError的调用
这个也是一个细节需要注意。onReceivedError可能并非页面加载或者跳转url出错时才会调用,我之前调用支付宝的时候页面正常加载也会调用onReceivedError方法,这样可能就会影响到逻辑
所以需要判断调用onReceivedError时当前加载的url是不是你加载的url
这里暂时列举这些吧,因为暂时就记得这些,其实webview的坑不只这么点,之后想起来再补充
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
FRIDA 实用手册
FRIDA 实用手册 本文目的是作为工具类文章,收集整理了一些 FRIDA 的使用技巧和用例,方便同学们在开发使用过程中开袋即食。 frida 的基础教程可以直接参看官网说明。 Python 部分 JS 中文支持 使用 codecs.open(scriptpath, "r", "utf-8") 打开文件读取 js 即可。 获取指定 UID 设备 device = frida.get_device_manager().get_device("094fdb0a0b0df7f8") 获取远程设备 mgr = frida.get_device_manager() device = mgr.add_remote_device("30.137.25.128:13355") 启动调试进程 pid = device.spawn([packename]) process
- 下一篇
Gradle排除依赖模块的某个类
好久没写文章了,开工第一天来一发开门红。既然没什么可写的,就简单聊聊Gradlew吧,是Gradle,命令敲多了习惯加个w,开个小玩笑。gradle用来构建项目可谓是十分的灵活,刚开始接触也许觉得有点懵,觉得这个东西就是多余的,但是用多了就真的会爱上它。我之前做组件化的时候就碰到锅这样一个问题,怎么排除某个类 Gradle怎么排除所依赖的模块的某各类 其实我觉得在很多的情况下都会碰到这个问题,比如你的老大写了个BaseModule,里面有很多东西,你就没必要造轮子了,但是其实你这个项目中用不到这么多,那就没必要在打包的时候也把多余的代码打进去,但是你又不能删掉,因为很多个模块都依赖这个Base模块,所以你只能用“排除”的方法来去掉多余的代码。再比如你自己的模块和所依赖的模块有同名类,包名都相同的那种,那就肯定编译不过,所以你要排除相同类。甚至还有很多情况需要你在依赖中排除某个类或者某个包。那么该怎么做?只要稍微用过gradle构建项目的都知道,如果我们在依赖时出现了相同的jar包,我们是可以排除的 implementation fileTree(include: ['*.jar'], ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装