关于shouldOverrideUrlLoading方法的一些考证

前言

这周在做一个需求时,需要用到WebView,但是在做的过程中,却遇到了一些问题。WebView我其实接触并不多,这次的需求里还涉及了一些JS交互之类的,所以我是边学边做,但是网上的示例和教程,往往藏着一些坑,这一次我就发现关于shouldOverrideUrlLoading这个方法,网上的说法真的是五花八门,这篇文章,我们来澄清一下shouldOverrideUrlLoading的真正用法。

正文

  1. 关于shouldOverrideUrlLoading用法的误解,主要还是集中在返回值上。
  • 错误说法1:返回true就调用系统浏览器,返回false由WebView处理。
  • 错误说法2:返回true当前url即使是重定向url也不会再执行,返回false由系统执行url,直到不再执行此方法。
  • 错误说法3:WebView上的所有加载都经过这个方法。
  • 错误说法4:这是一种广为流传的用法,在shouldOverrideUrlLoading中
@Override
       public boolean shouldOverrideUrlLoading(WebView view, String url) {
       view.loadUrl(url);
       return true;
       }

便可以在WebView中加载该url。

  1. 那么我们来看看官方文档是怎么说的:
  /**
     * Give the host application a chance to take over the control when a new
     * url is about to be loaded in the current WebView. If WebViewClient is not
     * provided, by default WebView will ask Activity Manager to choose the
     * proper handler for the url. If WebViewClient is provided, return true
     * means the host application handles the url, while return false means the
     * current WebView handles the url.
     * This method is not called for requests using the POST "method".
     *
     * @param view The WebView that is initiating the callback.
     * @param url The url to be loaded.
     * @return True if the host application wants to leave the current WebView
     *         and handle the url itself, otherwise return false.
     * @deprecated Use {@link #shouldOverrideUrlLoading(WebView, WebResourceRequest)
     *             shouldOverrideUrlLoading(WebView, WebResourceRequest)} instead.
     */

大致翻译一下:

  • 若没有设置 WebViewClient 则由系统(Activity Manager)处理该 url,通常是使用浏览器打开或弹出浏览器选择对话框。
  • 若设置 WebViewClient 且该方法返回 true ,则说明由应用的代码处理该 url,WebView 不处理,也就是程序员自己做处理。
  • 若设置 WebViewClient 且该方法返回 false,则说明由 WebView 处理该 url,即用 WebView 加载该 url。
  1. 所以上面的说法1和说法2都是错误的。对于说法4,直接返回false即可达到同样的效果。
    至于说法3,我在断点调试的时候就已经发现不对了,并不会每次加载都走shouldOverrideUrlLoading,但是文档里并没有说shouldOverrideUrlLoading真正的调用时机是什么,所以我继续在网上查找,终于找到一篇源码分析,得出结论:
    WebView的前进、后退、刷新、以及post请求都不会调用shouldOverrideUrlLoading方法,除去以上行为,还得满足( ! isLoadUrl || isRedirect) 即 (不是通过webView.loadUrl来加载的 或者 是重定向) 这个条件,才会调用shouldOverrideUrlLoading方法。

结语

通过这件事,让我在网上查找资料的时候更加谨慎了,因为已经不是第一次出现这种情况了。广为流传的错误答案,千篇一律的复制粘贴。这对于初学者来说,往往会造成严重的误导和困惑。所以我们在写东西的时候,也要更加慎重,不要把自己都没弄清楚的东西,当成结论发表出来,更不要不加思考的去复制粘贴别人的东西。理所应当的,本文中的结论,都是笔者在网上查资料,并且结合官方文档和源码,然后自己写程序验证过的,目的是为了让更多的初学者不被误导。当然了,人无完人,如果文中出现有误的地方,也欢迎大家指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最基础的使用方法 最简单的布局: 在Activity中使用WebView: 但只是这样的话,在模拟器上是会直接调到...
    HolenZhou阅读 7,855评论 12 33
  • 在上一篇中我们说了WebView的基本使用安卓开发之WebView的使用(1),里面提到了WebViewClien...
    Reathin阅读 2,773评论 0 14
  • WebView·开车指南 2016-08-31BugDev 北京市东城区首席Bug布道师开山之作,一整月交通事故血...
    53c021c38a1d阅读 854评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,080评论 19 139
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,633评论 0 17