理解WebViewClient各方法重写的作用
创建并设置一个WebViewClient子类,回调对应的方法改变网页内容的呈现方式,比如:网页加载错误回调onReceivedError(),提交表单错误回调onFormResubmission(),拦截URL加载回调shouldOverrideUrlLoading()方法,判断是否加载同一条url回调onPageStarted(),处理一个HTTP认证请求回调onReceivedHttpAuthRequest()方法,获取请求的数据回调shouldInterceptRequest()方法,拦截事件处理回调shouldOverrideKeyEvent()方法等等
其他方法的作用,如下:
- doUpdateVisitedHistory(WebView view, String url, boolean isReload)
更新浏览历史记录,获取更新的url地址
- onLoadResource(WebView view, String url)
加载给定url资源内容
- onPageCommitVisible(WebView view, String url)
正在加载HTTP响应的body内容,回调该方法,获取对应url地址
- onPageFinished(WebView view, String url)
页面加载完成回调方法,获取对应url地址
- onReceivedClientCertRequest(WebView view, ClientCertRequest request)
回调该方法,处理SSL认证请求
- onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse)
回调该方法,处理HTTP认证错误
- onReceivedLoginRequest(WebView view, String realm, String account, String args)
回调该方法,请求已授权用户自动登录
- onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)
回调该方法,处理SSL认证错误
- onScaleChanged(WebView view, float oldScale, float newScale)
页面大小改变后回调该方法,获取缩放前后大小
- onUnhandledKeyEvent(WebView view, KeyEvent event)
回调该方法,处理未被WebView处理的事件
- shouldOverrideKeyEvent(WebView view, KeyEvent event)
给予主机应用程序异步处理按键事件的机会
一个例子带我理解各个方法的作用
查看文档不难读懂重写每个方法的目的,尽管理解大概的意思,但缺少例子的演示,总感觉又不是很理解WebViewClient各个方法重写的作用,TeachCourse这就带你从例子角度理解它们的作用,深入理解WebViewClient在改变网页渲染方式上,应该回调哪个方法。
1、onReceivedError(),网络不好或服务器请求超时,WebView加载指定页面,请求不到数据,加载出错,WebView默认错误处理效果如下图
回调onReceivedError(),自己定义加载错误处理效果,比如:TeachCourse定义在没有网络时候,显示一张无网络的图片,如下图
API 23之前回调onReceivedError(WebView view, int errorCode, String description, String failingUrl);API 23之后回调onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)方法,在开发的应用程序中,最好同时重写上面两个错误处理的方法,兼容不同API版本,防止设置无效。
2、onFormResubmission(),由于页面需要使用POST方式获取结果,如果浏览器需要重发,回调onFormResubmission()方法,默认浏览器不重发请求数据。
3、shouldOverrideUrlLoading(),WebView加载H5界面,点击按钮发送短信或拨打电话,调不起短信编辑界面或拨打电话界面,通常都是因为没有重写shouldOverrideUrlLoading,拦截发送短信或拨打电话的url,处理H5界面请求。
H5页面使用a标签的href属性添加发送短信超链接:
- <a href="sms:182xxxxxx">一键短信发送</a>
处理发送短信请求,重写shouldOverrideUrlLoading,如下:
/** *定义处理正在加载url的方式 * @author 钊林IT * @param view * @param url * @return 当前浏览器处理正在加载的url,默认返回false;否则返回true */
public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("http:") || url.startsWith("https:")) { return false; } /** * 处理特殊的url地址,比如“sms:” */ if (url.startsWith("sms:")) { Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(url)); view.getContext().startActivity(intent); } return true;
}
同理,处理拨打H5界面电话请求
/** * 处理特殊的url地址,比如“tel:” * @author 钊林IT */
if (url.startsWith("tel:")) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); view.getContext().startActivity(intent); return true;
}
实现H5界面和原生APP交互,还可以使用JavaScript脚本,点击H5页面按钮时,通过脚本传递的对象,调用APP提供的方法,比如:发送短信或拨打电话。API 24以后改用 shouldOverrideUrlLoading(WebView, WebResourceRequest) 代替shouldOverrideUrlLoading (WebView view, String url),为了兼容不同API版本,最好同时重写上述两种方法。
4、onPageStarted(),在一个Activity首页展示一个H5弹窗,点击其中一条超链接,使用指定的浏览器打开,重写onPageStarted()监听即将加载的url是否需要使用指定的浏览器打开,onPageStarted为当前弹窗设置WebViewClient重写的一个方法,代码如下:
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); if (mUrl.equals(url)||TextUtils.isEmpty(url)) { return; } Intent intent = new Intent(PopupWindowActivity.this, BaseWebActivity.class); intent.putExtra("url",url); startActivity(intent);
}
5、onReceivedHttpAuthRequest(),当前应用程序的WebView接收一个HTTP认证请求,使用提供的HttpAuthHandler对象设置WebView对HTTP认证请求的响应,默认WebView取消HTTP认证,即handler.cancel()
6、shouldInterceptRequest(),请求资源的主机应用程序允许应用程序返回数据,如果该方法返回null,WebView将会按照平常一样继续加载;否则,返回的内容将会被使用。该方法在独立线程而非UI线程中回调,因此访问私有数据或系统视图时应该谨慎行事。
7、doUpdateVisitedHistory(),当前WebView加载的url被重新加载,isReload为true,这一步可以判读是否执行刷新操作,如下:
@Override
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) { super.doUpdateVisitedHistory(view, url, isReload); if (isReload) Toast.makeText(activity,"刷新成功",Toast.LENGTH_SHORT).show();
}
8、onLoadResource (),加载指定url资源,判读是否为.apk文件,然后启动系统的文件下载管理器,下载指定的文件,如下:
@Override
public void onLoadResource(WebView view, String url) { super.onLoadResource(view, url); if (url.endsWith(".apk")) loadManager(url);
}
9、onPageCommitVisible(),页面加载完成可见,如下:
@Override
public void onPageCommitVisible(WebView view, String url) { super.onPageCommitVisible(view, url); mProgressBar.setVisibility(ProgressBar.GONE); webView.setVisibility(View.VISIBLE); isWebViewLoadingFirstPage=false;
}
10、onPageFinished(),页面加载结束,回调该方法,如下:
@Override
public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); Toast.makeText(activity,"页面加载结束",Toast.LENGTH_SHORT).show();
}
11、onReceivedClientCertRequest(),提醒主机应用程序处理SSL客户端认证请求,如果客户端提供的keys符合,主机应用程序响应客户端请求并展示UI界面。主机应用程序有三种方法响应:第一种,proceed();第二种,cancel();第三种,ignore();如果调用proceed()或cancel(),WebView在内存保留请求的结果,同时同一请求不会再次回调onReceivedClientCertRequest()方法。如果调用ignore()方法,WebView不保存请求结果。
由于网络堆栈的多层级缓存请求结果,因此ignore()响应方式是唯一最好的选择。onReceivedClientCertRequest()方法在UI线程中调用,在回调该方法时,请求网络连接是暂停的。
12、onReceivedHttpError(),提醒主机应用程序,正在加载数据资源的时候,接收到一个来自服务器的HTTP认证错误,HTTP错误认证码>=400,除了加载网页内容,该方法都会被调用。因此,在该回调方法中最好执行最少的请求操作,同时服务器响应的结果内容不会在errorResponse参数中返回。
13、onReceivedLoginRequest(),提醒主机应用程序,请求已授权用户自动登录
14、onReceivedSslError(),提醒主机应用程序,正在加载数据资源的时候,出现了SSL认证错误,这个时候的主机应用程序必须调用handler.cancel()或handler.proceed()方法中的一个,默认调用cancel()方法。
15、onScaleChanged(),提醒主机应用程序,被应用于WebView的比例发生了改变
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) { super.onScaleChanged(view, oldScale, newScale); float size=oldScale/newScale; Toast.makeText(view.getContext(),"WebView比例改变:"+size,Toast.LENGTH_SHORT).show();
}
16、onUnhandledKeyEvent(),提醒主机应用程序,除了系统按键外,WebView不处理其他按键操作。通常流程,WebView总是消耗所有按键操作。按键被处理的时候异步回调该方法,给予主机应用程序一个处理未处理按键事件的机会。
17、shouldOverrideKeyEvent(),给予主机应用程序一个异步处理按键事件的机会,菜单快捷键在该方法中被拦截。WebView将不处理按键事件,返回true;否则默认返回false,WebView总是处理所有的按键事件。如果没有使用super关键字回调父类的shouldOverrideKeyEvent()方法,该方法将接收所有按键事件。
@Override
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) { return true;
}
相关阅读
《详细了解WebChromeClient源码各方法使用说明》
《Android开发深入理解WebChromeClient之onShowFileChooser或openFileChooser使用说明》
《WebView控件之WebSettings各种配置方法源码总结》
理解WebViewClient各方法重写的作用相关推荐
- python类方法继承_对python中类的继承与方法重写介绍
1.单继承 父类也叫基类 子类也叫派生类 如下所示,继承的关系: 继承的书写格式: class 子类(父类): 方法 实例: class Animal: def eat(self): print(&q ...
- 方法重载和方法重写的区别和作用
一.方法重载(Overload) 背景: 有时我们要用到一个函数同时兼容多种类型或者参数的情况,这时我们就要用到方法重载. 含义: 一个方法的逻辑是一样的,但是考虑到要适用不同的场景(参数个数不同,参 ...
- 令人发指的关于方法重载和方法重写的一些理解(多态)
令人发指的关于方法重载和方法重写的一些理解 文章目录 **令人发指的关于方法重载和方法重写的一些理解** **方法重载的基础** **子类的方法重载** **重载升级只重写** **顺藤摸瓜之干掉&q ...
- Java子类继承(二):隐藏成员变量和方法重写的理解
1,上篇说子类可以继承父类的成员变量,作为自己的成员变量,在Java中子类也可以隐藏由父类继承来的成员变量,只要子类中声明的成员变量和父类的成员变量同名,就可以将其隐藏. 需要的注意是:子类对象可以调 ...
- 从jvm角度看懂类初始化、方法重写、重载。
类初始化 在讲类的初始化之前,我们先来大概了解一下类的声明周期.如下图 类的声明周期可以分为7个阶段,但今天我们只讲初始化阶段.我们我觉得出来使用和卸载阶段外,初始化阶段是最贴近我们平时学的,也是笔试 ...
- 继承extends、super、this、方法重写overiding、final、代码块_DAY08
1:Math类的随机数(掌握) 类名调用静态方法. 包:java.lang 类:Math 方法:public static double random(): Java.lang包下的类是不用导包就可 ...
- 方法重写(Java篇)
很多人会问: 本来有的方法为什么要再写一遍? 重写的意义是什么? 两个方法调用的时候不会有冲突吗? 为什么不再新建一个全新的方法呢? 当一个子类继承一个父类时,它同时继承了父类的属性和方法.子类可以直 ...
- JAVA SE、EE、ME,JRE、JDK,基本数据类型,访问修饰符、函数、封装的概念、UML类图、构造方法、this关键字、static关键字、方法重载、方法重写、包(packahe)
运行第一个JAVA程序: 这里使用的开发环境是eclipse,新建一个java工程,然后可以看到src这个是存放java代码的地方,然后在src文件右击新建一个class(类),然后可以看到下图,同样 ...
- java重写的目的是什么_什么是重写?重写的作用?
一.什么是重写? 1.重写(Override)概念 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于 ...
最新文章
- 2019半年总结:Teams are powerful
- 《数据科学家养成手册》--第四章---数据科学的使命
- hwclock date
- 谈谈Visual Studio的缺点,比较Eclipse
- FCS编程之连接示例
- 图解TC++3.0开发教程
- WCF自定义地址路由映射(不用svc文件)
- Mysql中各种与字符编码集(character_set)有关的变量含义
- __getattr__动态获取接口
- 为什么要有res/values/ids.xml(一个res/values/ids.xml引发的血案)
- 页面加载速度缓慢时,如何优化?
- CPU瓶颈(五)--过度编译与不必要重复编译的解决方案
- 英文文献下载神器—Scihub
- ThoughtWorks笔试题汇总
- c 语言 如何优化cpu占用率,C#程序优化-有效减少CPU占用率
- python查询12306余票_python命令行查询12306火车票
- anaconda出现Multiple Errors Encountered.
- linux tac文件最后五行,tac命令以及各种linux文件查看命令
- [GUET-CTF2019]BabyRSA(p,q灵活应用)
- 网站不能复制怎么办?一招教你解决
热门文章
- 常用邮箱、网盘地址列表
- 计算机组成原理指令系统的设计,计算机组成原理与系统设计
- 概率统计·假设检验【正态总体均值的假设检验、正态总体方差的假设检验】
- 马斯克与SEC再次寻求法庭延长期限 以解决马斯克使用推特纷争
- Sdwan关于视频监控
- 跑步运动耳机哪个牌子好,值得推荐的六款跑步运动耳机
- 使用Systemctl命令来管理系统服务
- 程序员升职记 全关卡攻略通俗思路 Human Resource Machine
- mount ntfs to centos5
- python获取游戏数据_Python 爬取 3 万条游戏评分数据,原来程序员最爱玩的游戏竟然是.........