美文网首页安卓之美AndroiderAndroid知识
关于shouldOverrideUrlLoading方法的一些考

关于shouldOverrideUrlLoading方法的一些考

作者: 实例波 | 来源:发表于2017-05-07 16:45 被阅读275次

    前言

    这周在做一个需求时,需要用到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方法。

    结语

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

    相关文章

      网友评论

      • krmao:正好今天研究为什么没有回调
      • 黑白咖:最近遇到一个H5页面通过js异步Post请求下载文件的bug,原生WebView,腾讯X5,手机自带浏览器都无法处理响应的回调,但是电脑浏览器以及手机上UC浏览器都可以下载(PS,WebView拦截POST请求不能获取到里面的请求参数,所以也做不到拦截后手动请求),不知道作者有没有相关的思路
      • 黑白咖:签到
      • ania:想问下能贴出那个分析源码的文章么?现在遇到一个问题就是点击webview中的一个链接,不回调shouldOverrideUrlLoading这个方法,所以对这个方法在哪些条件下不会被执行比较疑惑..
        ania:@实例波 感谢!😀
        实例波:http://blog.csdn.net/a0407240134/article/details/51482021?winzoom=1
        这是我参考的源码分析文章,由于chrome是闭源的,所以文中分析的是Chromium的源码,差异应该不大,希望对你有所帮助。
      • HumorousMan:厉害了,我的波
        实例波: @HumorousMan 😘😘

      本文标题:关于shouldOverrideUrlLoading方法的一些考

      本文链接:https://www.haomeiwen.com/subject/sfwutxtx.html