WebView shouldOverrideUrlLoading 不触发原因

转载 2013年10月17日 14:58:26

WebView shouldOverrideUrlLoading and redirect问题 

2012-11-23 11:36:46|  分类: Android |  标签: |字号 订阅

问题:客户端界面中打开安卓市场某款产品的下载界面。点击下载按钮后,并不走客户端写在shouldOverrideUrlLoading中的处理逻辑。导致该包不能下载。

ps:安卓市场下载按钮是通过js跳转的。


原来,android平台下,在ApiLevel小于11的情况下,webview的shouldOverrideUrlLoading并不是每次都会调用。

所以需要添加平台适配。或者将放在shouldOverrideUrlLoading中的逻辑放在onPageStarted方法中去处理。


Androids WebView class provides a method called shouldOverrideUrlLoading to intercept the loading of the requested URLs.
This gives us the ability to suppress loading of the given URL or handle a URL in the external browser for example.

If you want to prevent the webview from loading the URL you have to return true. Otherwise the url is forwarded to the webview as usual.

  1. _webView.setWebViewClient(new WebViewClient() { 
  2.   @Override 
  3.   public boolean shouldOverrideUrlLoading(WebView view, String url) { 
  4.     boolean shouldOverride = false
  5.     if (url.startsWith("https://")) { //NON-NLS 
  6.       // DO SOMETHING 
  7.       shouldOverride = true
  8.     } 
  9.     return shouldOverride; 
  10.   } 

This mechanism works fine for all URLs triggered by a user tapping on a link.

Unfortunately this method does not get invoked if the URLs source is a redirect on devices running Android < 3.0 (API Level 10 and lower).
Although it will be invoked an works just fine on devices with Android >= 3.0 (API Level 11 and up).

Android < 3.0 -> shouldOverrideUrlLoading will not be called on redirects

Android >= 3.0 -> shouldOverrideUrlLoading will be called even on redirects

You can find some fellow developers facing the same issue.

As a Workaround we use the recommended onPageStarted(WebView view, String url, Bitmap favicon)

Usage is quite the same as shouldOverrideUrlLoading:

  1. _webView.setWebViewClient(new WebViewClient() { 
  2.   @Override 
  3.   public void onPageStarted(WebView view, String url, Bitmap favicon){ 
  4.     if (url.startsWith("https://")) { //NON-NLS 
  5.       view.stopLoading(); 
  6.       // DO SOMETHING 
  7.     } 
  8.   } 
  9. }  

With view.stopLoading the webview will stop loading of the new URL and still show the current content. This equals the behavior of shouldOverrideUrlLoading returning true.

The advantage is it works on all Android versions.

However the drawback is onPageStarted is invoked AFTER the page was requested form server. That means, the request is already sent to the server even if the response is afterward ignored.

The method shouldOverrideUrlLoading would let you omit the request BEFORE it is sent. So you would be able to save the outgoing web request.

相关文章推荐

android WebView shouldOverrideUrlLoading 不执行问题

在使用WebView自动下载文件时候,重写shouldOverrideUrlLoading方法就可以;但是在有些手机上次方法不起作用,此时再重写onPageStarted方法即可解决该问题。 ...
  • leeo1010
  • leeo1010
  • 2014年12月27日 20:53
  • 17882

在WebView自身打开链接 -- 关于WebViewClient类shouldOverrideUrlLoading的错误用法

我所参与的一个小项目有个需求就是使用 WebView 加载一个论坛,那么论坛页面上的链接跳转就需要限制在WebView中,而不是使用默认的浏览器应用打开;而默认情况下,Android 系统会启动一个应...

shouldOverrideUrlLoading调用机制新理解

shouldOverrideUrlLoading 以前认为是截获用户点击的, 其实不仅这个,我网页内不通过点击,自动执行{    window.location.href="http://baid...

android webview 二次验证流程分析 shouldOverrideUrlLoading深度分析

一. shouldOverrideUrlLoading的含义  Sdk中的解释 public boolean shouldOverrideUrlLoading (WebView view, Str...

android webview对shouldOverrideUrlLoading的理解,对于重定向的url

webView.getSettings().setJavaScriptEnabled(true);//支持js webView.setWebChromeClient(new ChromeClient(...
  • zhongwn
  • zhongwn
  • 2015年09月25日 14:24
  • 15268

Android博客挑错系列之二 WebView的shouldOverrideUrlLoading的正确用法

正确用法参见 http://www.cnblogs.com/shaobin0604/p/3313680.html 小星就不赘述了~ 这个是在实现我们的小说阅读软件淘小说时...

shouldOverrideUrlLoading

WebView  wView =(WebView)findViewById(R.id.webview); wView.setWebViewClient(new WebViewClient(){  ...

WebView中shouldOverrideUrlLoading和onPageStarted方法的区别

WebView中的shouldOverrideUrlLoading和onPageStarted这两个方法就是可以捕获到跳转的url,然后进行一系列的操作,但是他们两到底有什么区别呢? 当点击页面中的...

android WebView shouldOverrideUrlLoading 不执行问题

在使用WebView自动下载文件时候,重写shouldOverrideUrlLoading方法就可以;但是在有些手机上次方法不起作用,此时再重写onPageStarted方法即可解决该问题。 ...
  • leeo1010
  • leeo1010
  • 2014年12月27日 20:53
  • 17882

Android产品研发(十一)-->应用内跳转Scheme协议

上一篇文章中我们讲解了在Android App的实际开发中,尽量不在静态变量、全局变量中保存数据,这是因为App的进程可能是不安全的,在部分手机中其有可能被系统杀死,从而造成静态全局变量重新初始化。而...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebView shouldOverrideUrlLoading 不触发原因
举报原因:
原因补充:

(最多只允许输入30个字)