创建并设置一个WebViewClient子类,回调对应的方法改变网页内容的呈现方式,比如:网页加载错误回调onReceivedError(),提交表单错误回调onFormResubmission(),拦截URL加载回调shouldOverrideUrlLoading()方法,判断是否加载同一条url回调onPageStarted(),处理一个HTTP认证请求回调onReceivedHttpAuthRequest()方法,获取请求的数据回调shouldInterceptRequest()方法,拦截事件处理回调shouldOverrideKeyEvent()方法等等

其他方法的作用,如下:

  1. doUpdateVisitedHistory(WebView view, String url, boolean isReload)

更新浏览历史记录,获取更新的url地址

  1. onLoadResource(WebView view, String url)

加载给定url资源内容

  1. onPageCommitVisible(WebView view, String url)

正在加载HTTP响应的body内容,回调该方法,获取对应url地址

  1. onPageFinished(WebView view, String url)

页面加载完成回调方法,获取对应url地址

  1. onReceivedClientCertRequest(WebView view, ClientCertRequest request)

回调该方法,处理SSL认证请求

  1. onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse)

回调该方法,处理HTTP认证错误

  1. onReceivedLoginRequest(WebView view, String realm, String account, String args)

回调该方法,请求已授权用户自动登录

  1. onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)

回调该方法,处理SSL认证错误

  1. onScaleChanged(WebView view, float oldScale, float newScale)

页面大小改变后回调该方法,获取缩放前后大小

  1. onUnhandledKeyEvent(WebView view, KeyEvent event)

回调该方法,处理未被WebView处理的事件

  1. 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属性添加发送短信超链接:

  1. <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各方法重写的作用相关推荐

  1. python类方法继承_对python中类的继承与方法重写介绍

    1.单继承 父类也叫基类 子类也叫派生类 如下所示,继承的关系: 继承的书写格式: class 子类(父类): 方法 实例: class Animal: def eat(self): print(&q ...

  2. 方法重载和方法重写的区别和作用

    一.方法重载(Overload) 背景: 有时我们要用到一个函数同时兼容多种类型或者参数的情况,这时我们就要用到方法重载. 含义: 一个方法的逻辑是一样的,但是考虑到要适用不同的场景(参数个数不同,参 ...

  3. 令人发指的关于方法重载和方法重写的一些理解(多态)

    令人发指的关于方法重载和方法重写的一些理解 文章目录 **令人发指的关于方法重载和方法重写的一些理解** **方法重载的基础** **子类的方法重载** **重载升级只重写** **顺藤摸瓜之干掉&q ...

  4. Java子类继承(二):隐藏成员变量和方法重写的理解

    1,上篇说子类可以继承父类的成员变量,作为自己的成员变量,在Java中子类也可以隐藏由父类继承来的成员变量,只要子类中声明的成员变量和父类的成员变量同名,就可以将其隐藏. 需要的注意是:子类对象可以调 ...

  5. 从jvm角度看懂类初始化、方法重写、重载。

    类初始化 在讲类的初始化之前,我们先来大概了解一下类的声明周期.如下图 类的声明周期可以分为7个阶段,但今天我们只讲初始化阶段.我们我觉得出来使用和卸载阶段外,初始化阶段是最贴近我们平时学的,也是笔试 ...

  6. 继承extends、super、this、方法重写overiding、final、代码块_DAY08

    1:Math类的随机数(掌握) 类名调用静态方法.  包:java.lang 类:Math 方法:public static double random(): Java.lang包下的类是不用导包就可 ...

  7. 方法重写(Java篇)

    很多人会问: 本来有的方法为什么要再写一遍? 重写的意义是什么? 两个方法调用的时候不会有冲突吗? 为什么不再新建一个全新的方法呢? 当一个子类继承一个父类时,它同时继承了父类的属性和方法.子类可以直 ...

  8. JAVA SE、EE、ME,JRE、JDK,基本数据类型,访问修饰符、函数、封装的概念、UML类图、构造方法、this关键字、static关键字、方法重载、方法重写、包(packahe)

    运行第一个JAVA程序: 这里使用的开发环境是eclipse,新建一个java工程,然后可以看到src这个是存放java代码的地方,然后在src文件右击新建一个class(类),然后可以看到下图,同样 ...

  9. java重写的目的是什么_什么是重写?重写的作用?

    一.什么是重写? 1.重写(Override)概念 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于 ...

最新文章

  1. 2019半年总结:Teams are powerful
  2. 《数据科学家养成手册》--第四章---数据科学的使命
  3. hwclock date
  4. 谈谈Visual Studio的缺点,比较Eclipse
  5. FCS编程之连接示例
  6. 图解TC++3.0开发教程
  7. WCF自定义地址路由映射(不用svc文件)
  8. Mysql中各种与字符编码集(character_set)有关的变量含义
  9. __getattr__动态获取接口
  10. 为什么要有res/values/ids.xml(一个res/values/ids.xml引发的血案)
  11. 页面加载速度缓慢时,如何优化?
  12. CPU瓶颈(五)--过度编译与不必要重复编译的解决方案
  13. 英文文献下载神器—Scihub
  14. ThoughtWorks笔试题汇总
  15. c 语言 如何优化cpu占用率,C#程序优化-有效减少CPU占用率
  16. python查询12306余票_python命令行查询12306火车票
  17. anaconda出现Multiple Errors Encountered.
  18. linux tac文件最后五行,tac命令以及各种linux文件查看命令
  19. [GUET-CTF2019]BabyRSA(p,q灵活应用)
  20. 网站不能复制怎么办?一招教你解决

热门文章

  1. 常用邮箱、网盘地址列表
  2. 计算机组成原理指令系统的设计,计算机组成原理与系统设计
  3. 概率统计·假设检验【正态总体均值的假设检验、正态总体方差的假设检验】
  4. 马斯克与SEC再次寻求法庭延长期限 以解决马斯克使用推特纷争
  5. Sdwan关于视频监控
  6. 跑步运动耳机哪个牌子好,值得推荐的六款跑步运动耳机
  7. 使用Systemctl命令来管理系统服务
  8. 程序员升职记 全关卡攻略通俗思路 Human Resource Machine
  9. mount ntfs to centos5
  10. python获取游戏数据_Python 爬取 3 万条游戏评分数据,原来程序员最爱玩的游戏竟然是.........